构建网站目录和文件列表

时间:2013-10-24 02:19:19

标签: python html tree

对于那里的人来说,这可能是也可能不是一件容易的事情......

我正在尝试构建文件还原服务。我有一本看起来像这样的字典。

{'full_path': '/home/michael/Data',
 'items': {'UpgradeToCentOS5': {'full_path': '/home/michael/Data/UpgradeToCentOS5',
                                'type': 'f',
                                'versions': ['current', '09/10/12']},
           'basic_debian': {'full_path': '/home/michael/Data/basic_debian',
                            'type': 'f',
                            'versions': ['current']},
           'deploy.tgz': {'full_path': '/home/michael/Data/deploy.tgz',
                          'type': 'f',
                          'versions': ['current']},
           'firewall': {'full_path': '/home/michael/Data/firewall',
                        'type': 'f',
                        'versions': ['current']},
           'legalholder.sh': {'full_path': '/home/michael/Data/legalholder.sh',
                              'type': 'f',
                              'versions': ['current']},
           'lists': {'full_path': '/home/michael/Data/lists',
                     'items': {'boothosts': {'full_path': '/home/michael/Data/lists/boothosts',
                                             'type': 'f',
                                             'versions': ['current']},
                               'checklist': {'full_path': '/home/michael/Data/lists/checklist',
                                             'type': 'f',
                                             'versions': ['current']},
                               'ns_ip': {'full_path': '/home/michael/Data/lists/ns_ip',
                                         'type': 'f',
                                         'versions': ['current']},
                               'server_info': {'full_path': '/home/michael/Data/lists/server_info',
                                               'type': 'f',
                                               'versions': ['current']},
                               'temp': {'full_path': '/home/michael/Data/lists/temp',
                                        'type': 'f',
                                        'versions': ['current']},
                               'tsm_clients': {'full_path': '/home/michael/Data/lists/tsm_clients',
                                               'type': 'f',
                                               'versions': ['current']}},
                     'type': 'd',
                     'versions': ['current']},
           'salt': {'full_path': '/home/michael/Data/salt',
                    'type': 'f',
                    'versions': ['current']},
           'std-srv': {'full_path': '/home/michael/Data/std-srv',
                       'type': 'f',
                       'versions': ['current']},
           'upgrade_debian_6': {'full_path': '/home/michael/Data/upgrade_debian_6',
                                'type': 'f',
                                'versions': ['current']},
           'using-imaps': {'full_path': '/home/michael/Data/using-imaps',
                           'type': 'f',
                           'versions': ['current']},
           'xiv_online_resize': {'full_path': '/home/michael/Data/xiv_online_resize',
                                 'type': 'f',
                                 'versions': ['current']}},
 'type': 'd',
 'versions': ['current']}

基本上......它是我发现可以恢复的数据的字典。所有文件(不确定目录)都有“版本”,这是该文件存在的版本列表。

我正在试图弄清楚我将如何将其转换为HTML数据,用户可以使用它来选择他们想要恢复的文件版本。 (限制是每个文件的一个版本恢复。

我从未构建过这样的东西,而且我没有在搜索中提起任何东西。

我的细节中缺少什么?

我想/我正在寻找的是这样的......

- home
-- /michael
--- /Data
---- UpgradeToCentOS5
      □ Version: current
      □ Version: 09/10/12
---- basic_debian
      □ Version: current
---- deploy.tgz
      □ Version: current
---- firewall
      □ Version: current
---- legalholder.sh
      □ Version: current
---- lists
----- boothosts
       □ Version: current
[...]

1 个答案:

答案 0 :(得分:1)

我用它来制作类似你的例子。

recovery = {'full_path': '/home/michael/Data',
 'items': {'UpgradeToCentOS5': {'full_path': '/home/michael/Data/UpgradeToCentOS5',
                                'type': 'f',
                                'versions': ['current', '09/10/12']},
           'basic_debian': {'full_path': '/home/michael/Data/basic_debian',
                            'type': 'f',
                            'versions': ['current']},
           'deploy.tgz': {'full_path': '/home/michael/Data/deploy.tgz',
                          'type': 'f',
                          'versions': ['current']},
           'firewall': {'full_path': '/home/michael/Data/firewall',
                        'type': 'f',
                        'versions': ['current']},
           'legalholder.sh': {'full_path': '/home/michael/Data/legalholder.sh',
                              'type': 'f',
                              'versions': ['current']},
           'lists': {'full_path': '/home/michael/Data/lists',
                     'items': {'boothosts': {'full_path': '/home/michael/Data/lists/boothosts',
                                             'type': 'f',
                                             'versions': ['current']},
                               'checklist': {'full_path': '/home/michael/Data/lists/checklist',
                                             'type': 'f',
                                             'versions': ['current']},
                               'ns_ip': {'full_path': '/home/michael/Data/lists/ns_ip',
                                         'type': 'f',
                                         'versions': ['current']},
                               'server_info': {'full_path': '/home/michael/Data/lists/server_info',
                                               'type': 'f',
                                               'versions': ['current']},
                               'temp': {'full_path': '/home/michael/Data/lists/temp',
                                        'type': 'f',
                                        'versions': ['current']},
                               'tsm_clients': {'full_path': '/home/michael/Data/lists/tsm_clients',
                                               'type': 'f',
                                               'versions': ['current']}},
                     'type': 'd',
                     'versions': ['current']},
           'salt': {'full_path': '/home/michael/Data/salt',
                    'type': 'f',
                    'versions': ['current']},
           'std-srv': {'full_path': '/home/michael/Data/std-srv',
                       'type': 'f',
                       'versions': ['current']},
           'upgrade_debian_6': {'full_path': '/home/michael/Data/upgrade_debian_6',
                                'type': 'f',
                                'versions': ['current']},
           'using-imaps': {'full_path': '/home/michael/Data/using-imaps',
                           'type': 'f',
                           'versions': ['current']},
           'xiv_online_resize': {'full_path': '/home/michael/Data/xiv_online_resize',
                                 'type': 'f',
                                 'versions': ['current']}},
 'type': 'd',
 'versions': ['current']}

import os

def get_parent_dirs(path):
    parents = []
    x = path.split('/')[1:-1]
    for i in range(len(x)):
        parents.append('/'.join(x[0:i+1]))
    return parents

# Get a list of files and versions from the dictionary
items = []
pending = [recovery]
while pending:
    x = pending.pop(0)
    for item in x['items']:
        item = x['items'][item]
        if item.has_key('items'): # a directory
            pending.append(item)
        else: # a file
            items.append((item['full_path'], item['versions']))
items.sort()

parent_dirs = []
for path, versions in items:

    # Print parent directories if necessary
    for directory in get_parent_dirs(path):
        if not directory in parent_dirs:
            parent_dirs.append(directory)
            print '%s /%s' % (len(directory.split('/'))*'-', os.path.split(directory)[1])

    # Print file versions
    directory, filename = os.path.split(path)
    padding = len(path.split('/'))-1
    print '%s %s' % (padding*'-', filename)
    for version in versions:
        print '%s [] Version: %s' % (' '*padding, version)