Login

Management command which helps to find temlate files

Author:
skyjur
Posted:
January 5, 2011
Language:
Python
Version:
1.2
Score:
0 (after 0 ratings)

If you need to customize many default templates from installed apps, this management command will help you to find those templates and to copy them to desired location.

Place this code at:

management/commands/templates.py

To see a list of installed templates, run:

python manage.py templates

To copy all templates to specified location:

python manage.py templates --copy-to ./templates

To copy templates from specified applications only:

python manage.py templates admin auth --copy-to ./templates
 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
import os
from optparse import make_option
from shutil import copyfile

from django.core.management.base import BaseCommand, CommandError
from django.utils.importlib import import_module

class Command(BaseCommand):
    help = "List all templates."
    args = "[appname [appname2 [...]]]"

    option_list = BaseCommand.option_list + (
         make_option('-e', '--exclude', dest='exclude',action='append', default=[],
            help='App to exclude (use multiple --exclude to exclude multiple apps).'),
         make_option('-c', '--copy-to', dest='copy_to',action='store', 
                     default=False, help=('Copy templates to direcdory. (files '
                                          'are not oweritten if they exist).')),

    )

    def handle(self, *app_labels, **options):
        exclude = options.get('exclude',[])
        copy_to = options.get('copy_to', False)

        apps = self._get_apps(app_labels, exclude)

        templates_dirs = []

        for app in apps:
            module = import_module(app)
            module_dir = os.path.dirname(module.__file__)
            templates_dirs.append(os.path.join(module_dir, 'templates'))

        for templates_dir in templates_dirs:
            templates = self._find_files(templates_dir)

            print templates_dir, ':'

            for template_name in templates:
                print '    ', template_name

                if copy_to:
                    copied = self._copy_file(templates_dir, copy_to, template_name)
                    if copied:
                        print "        Copied."
                    else:
                        print "        Template already exists."

    def _get_apps(self, app_labels, exclude):
        from django.conf import settings

        apps = dict([(app.split('.')[-1], app) for app in settings.INSTALLED_APPS])

        try:
            [apps.pop(app_label) for app_label in exclude]
        except KeyError, key:
            raise CommandError("Unknown application: %s in excluded apps" % key)

        if len(app_labels) > 0:
            try:
                apps = [apps.pop(app_label) for app_label in app_labels]
            except KeyError, key:
                raise CommandError("Unknown application: %s" % key)
        else:
            apps = apps.values()

        return apps

    def _find_files(self, location):
        """Recursively finds files at location. Returns list of relative to
        filename files"""
        files = []
        for dirpath, dirnames, filenames in os.walk(location):
            for filename in filenames:
                file_name = os.path.join(dirpath, filename) \
                                   .replace(location, '') \
                                   .strip('/\\')
                files.append(file_name)
        return files

    def _copy_file(self, src, dest, file):
        src = os.path.join(src, file)
        dest = os.path.join(dest, file)
        dest_dir = os.path.dirname(dest)

        if not os.path.exists(dest_dir):
            os.makedirs(dest_dir, 0773)

        if not os.path.exists(dest):
            copyfile(src, dest)
            return True
        else:
            return False

More like this

  1. Template tag - list punctuation for a list of items by shapiromatron 10 months, 1 week ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 2 weeks ago
  3. Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
  5. Help text hyperlinks by sa2812 1 year, 6 months ago

Comments

Please login first before commenting.