Statistics
| Branch: | Tag: | Revision:

root / snf-webproject / synnefo / webproject / management / commands / link_static.py @ b6426ead

History | View | Annotate | Download (4 kB)

1 e868d384 Kostas Papadimitriou
# Copyright 2011 GRNET S.A. All rights reserved.
2 e868d384 Kostas Papadimitriou
#
3 e868d384 Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or without
4 e868d384 Kostas Papadimitriou
# modification, are permitted provided that the following conditions
5 e868d384 Kostas Papadimitriou
# are met:
6 e868d384 Kostas Papadimitriou
#
7 e868d384 Kostas Papadimitriou
#   1. Redistributions of source code must retain the above copyright
8 e868d384 Kostas Papadimitriou
#      notice, this list of conditions and the following disclaimer.
9 e868d384 Kostas Papadimitriou
#
10 e868d384 Kostas Papadimitriou
#  2. Redistributions in binary form must reproduce the above copyright
11 e868d384 Kostas Papadimitriou
#     notice, this list of conditions and the following disclaimer in the
12 e868d384 Kostas Papadimitriou
#     documentation and/or other materials provided with the distribution.
13 e868d384 Kostas Papadimitriou
#
14 e868d384 Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 e868d384 Kostas Papadimitriou
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 e868d384 Kostas Papadimitriou
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 e868d384 Kostas Papadimitriou
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 e868d384 Kostas Papadimitriou
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 e868d384 Kostas Papadimitriou
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 e868d384 Kostas Papadimitriou
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 e868d384 Kostas Papadimitriou
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 e868d384 Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 e868d384 Kostas Papadimitriou
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 e868d384 Kostas Papadimitriou
# SUCH DAMAGE.
25 e868d384 Kostas Papadimitriou
#
26 e868d384 Kostas Papadimitriou
# The views and conclusions contained in the software and documentation are
27 e868d384 Kostas Papadimitriou
# those of the authors and should not be interpreted as representing official
28 e868d384 Kostas Papadimitriou
# policies, either expressed or implied, of GRNET S.A.
29 e868d384 Kostas Papadimitriou
"""
30 e868d384 Kostas Papadimitriou
Collect static files required by synnefo to a specific location
31 e868d384 Kostas Papadimitriou
"""
32 a442c81d Ilias Tsitsimpis
import os
33 e868d384 Kostas Papadimitriou
34 e868d384 Kostas Papadimitriou
from django.utils.importlib import import_module
35 e868d384 Kostas Papadimitriou
from optparse import make_option
36 e868d384 Kostas Papadimitriou
from django.conf import settings
37 e868d384 Kostas Papadimitriou
38 b6426ead Ilias Tsitsimpis
from snf_django.management.commands import SynnefoCommand
39 b6426ead Ilias Tsitsimpis
40 0b9b9cd2 Kostas Papadimitriou
STATIC_FILES = getattr(settings, "STATIC_FILES", {})
41 e868d384 Kostas Papadimitriou
42 a442c81d Ilias Tsitsimpis
43 b6426ead Ilias Tsitsimpis
class Command(SynnefoCommand):
44 e868d384 Kostas Papadimitriou
45 e868d384 Kostas Papadimitriou
    help = 'Symlink static files to directory specified'
46 e868d384 Kostas Papadimitriou
47 b6426ead Ilias Tsitsimpis
    option_list = SynnefoCommand.option_list + (
48 a442c81d Ilias Tsitsimpis
        make_option(
49 a442c81d Ilias Tsitsimpis
            '--static-root',
50 e868d384 Kostas Papadimitriou
            action='store',
51 e868d384 Kostas Papadimitriou
            dest='static_root',
52 e868d384 Kostas Papadimitriou
            default=settings.MEDIA_ROOT,
53 a442c81d Ilias Tsitsimpis
            help='Path to place symlinks (default: `%s`)'
54 a442c81d Ilias Tsitsimpis
                 % settings.MEDIA_ROOT),
55 a442c81d Ilias Tsitsimpis
        make_option(
56 a442c81d Ilias Tsitsimpis
            '--dry-run',
57 e868d384 Kostas Papadimitriou
            action='store_true',
58 e868d384 Kostas Papadimitriou
            dest='dry',
59 e868d384 Kostas Papadimitriou
            default=False,
60 e868d384 Kostas Papadimitriou
            help='Do not actually create symlinks'),
61 e868d384 Kostas Papadimitriou
        )
62 e868d384 Kostas Papadimitriou
63 e868d384 Kostas Papadimitriou
    def collect_files(self, target):
64 e868d384 Kostas Papadimitriou
        symlinks = []
65 e868d384 Kostas Papadimitriou
        for module, ns in STATIC_FILES.iteritems():
66 e868d384 Kostas Papadimitriou
            module = import_module(module)
67 a442c81d Ilias Tsitsimpis
            static_root = os.path.join(os.path.dirname(module.__file__),
68 a442c81d Ilias Tsitsimpis
                                       'static')
69 e868d384 Kostas Papadimitriou
70 8f39ec0d Kostas Papadimitriou
            # no nested dir exists for the app
71 8f39ec0d Kostas Papadimitriou
            if ns == '':
72 8f39ec0d Kostas Papadimitriou
                for f in os.listdir(static_root):
73 a442c81d Ilias Tsitsimpis
                    symlinks.append((os.path.join(static_root, f),
74 a442c81d Ilias Tsitsimpis
                                     os.path.join(target, ns, f)))
75 8f39ec0d Kostas Papadimitriou
76 8f39ec0d Kostas Papadimitriou
            # symlink whole app directory
77 8f39ec0d Kostas Papadimitriou
            else:
78 a442c81d Ilias Tsitsimpis
                symlinks.append((os.path.join(static_root),
79 a442c81d Ilias Tsitsimpis
                                 os.path.join(target, ns)))
80 8f39ec0d Kostas Papadimitriou
81 8f39ec0d Kostas Papadimitriou
        return symlinks
82 e868d384 Kostas Papadimitriou
83 e868d384 Kostas Papadimitriou
    def handle(self, *args, **options):
84 e868d384 Kostas Papadimitriou
85 a442c81d Ilias Tsitsimpis
        self.stderr.write("The following synlinks will get created")
86 e868d384 Kostas Papadimitriou
87 8f39ec0d Kostas Papadimitriou
        symlinks = self.collect_files(options['static_root'])
88 e868d384 Kostas Papadimitriou
        for linkfrom, linkto in symlinks:
89 a442c81d Ilias Tsitsimpis
            self.stderr.write("Symlink '%s' to '%s' will get created."
90 a442c81d Ilias Tsitsimpis
                              % (linkfrom, linkto))
91 e868d384 Kostas Papadimitriou
92 e868d384 Kostas Papadimitriou
        if not options['dry']:
93 e868d384 Kostas Papadimitriou
            confirm = raw_input("""
94 e868d384 Kostas Papadimitriou
Are you soure you want to continue ?
95 e868d384 Kostas Papadimitriou
Type 'yes' to continue, or 'no' to cancel: """)
96 e868d384 Kostas Papadimitriou
97 e868d384 Kostas Papadimitriou
            if confirm == "yes":
98 e868d384 Kostas Papadimitriou
                for linkfrom, linkto in symlinks:
99 a442c81d Ilias Tsitsimpis
                    self.stderr.write("Creating link from %s to %s"
100 a442c81d Ilias Tsitsimpis
                                      % (linkfrom, linkto))
101 8f39ec0d Kostas Papadimitriou
                    if os.path.exists(linkto):
102 a442c81d Ilias Tsitsimpis
                        self.stderr.write("Skippig %s" % linkto)
103 8f39ec0d Kostas Papadimitriou
                        continue
104 8f39ec0d Kostas Papadimitriou
105 e868d384 Kostas Papadimitriou
                    os.symlink(linkfrom, linkto)