~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/directory_ui.py

  • Committer: Michael Hudson
  • Date: 2008-06-25 06:18:13 UTC
  • mfrom: (174.1.8 streaming)
  • Revision ID: michael.hudson@canonical.com-20080625061813-3cr5iax8sdz0e67s
merge my streaming branch which:
 * most importantly, streams the pages as they render to the client, which 
   reduces memory usage on large pages and feels better for the user
 * makes the stuff in controller/ have a more wsgi-ish interface
 * restores the stripping of excess whitespace from the output

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2008  Canonical Ltd.
2
 
#                     (Authored by Martin Albisetti <argentina@gmail.com>)
3
 
#
4
 
# This program is free software; you can redistribute it and/or modify
5
 
# it under the terms of the GNU General Public License as published by
6
 
# the Free Software Foundation; either version 2 of the License, or
7
 
# (at your option) any later version.
8
 
#
9
 
# This program is distributed in the hope that it will be useful,
10
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
# GNU General Public License for more details.
13
 
#
14
 
# You should have received a copy of the GNU General Public License
15
 
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
 
#
18
 
 
19
 
import datetime
20
 
import logging
21
 
import stat
22
 
 
23
 
from bzrlib import branch, errors
24
 
 
25
 
from loggerhead import util
26
 
from loggerhead.controllers import TemplatedBranchView
27
 
 
28
 
 
29
 
class DirEntry(object):
30
 
 
31
 
    def __init__(self, dirname, parity, branch):
32
 
        self.dirname = dirname
33
 
        self.parity = parity
34
 
        self.branch = branch
35
 
        if branch is not None:
36
 
            # If a branch is empty, bzr raises an exception when trying this
37
 
            try:
38
 
                self.last_change = datetime.datetime.fromtimestamp(
39
 
                    branch.repository.get_revision(
40
 
                        branch.last_revision()).timestamp)
41
 
            except:
42
 
                self.last_change = None
43
 
 
44
 
 
45
 
class DirectoryUI(TemplatedBranchView):
46
 
    """
47
 
    """
48
 
 
49
 
    template_path = 'loggerhead.templates.directory'
50
 
 
51
 
    def __init__(self, static_url_base, transport, name):
52
 
 
53
 
        class _branch(object):
54
 
            context_url = 1
55
 
 
56
 
            @staticmethod
57
 
            def static_url(path):
58
 
                return self._static_url_base + path
59
 
        self._branch = _branch
60
 
        self._history_callable = lambda: None
61
 
        self._name = name
62
 
        self._static_url_base = static_url_base
63
 
        self.transport = transport
64
 
        self.log = logging.getLogger('')
65
 
 
66
 
    def get_values(self, path, kwargs, response):
67
 
        listing = [d for d in self.transport.list_dir('.')
68
 
                   if not d.startswith('.')]
69
 
        listing.sort(key=lambda x: x.lower())
70
 
        dirs = []
71
 
        parity = 0
72
 
        for d in listing:
73
 
            try:
74
 
                b = branch.Branch.open_from_transport(self.transport.clone(d))
75
 
                if b.get_config().get_user_option('http_serve') == 'False':
76
 
                    continue
77
 
            except:
78
 
                try:
79
 
                    if not stat.S_ISDIR(self.transport.stat(d).st_mode):
80
 
                        continue
81
 
                except errors.NoSuchFile:
82
 
                    continue
83
 
                b = None
84
 
            dirs.append(DirEntry(d, parity, b))
85
 
            parity = 1 - parity
86
 
        # Create breadcrumb trail
87
 
        directory_breadcrumbs = util.directory_breadcrumbs(
88
 
                self._name,
89
 
                False,
90
 
                'directory')
91
 
        return {
92
 
            'dirs': dirs,
93
 
            'name': self._name,
94
 
            'directory_breadcrumbs': directory_breadcrumbs,
95
 
            }