~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/changelog_ui.py

  • Committer: Michael Hudson
  • Date: 2008-06-18 04:30:50 UTC
  • Revision ID: michael.hudson@canonical.com-20080618043050-u8e5qcj64tf16can
don't insist on python 2.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
18
#
19
19
 
20
 
import urllib
21
 
 
22
 
try:
23
 
    import simplejson
24
 
except ImportError:
25
 
    import json as simplejson
26
 
 
27
 
from paste.httpexceptions import HTTPServerError
 
20
import time
 
21
 
 
22
import turbogears
 
23
from cherrypy import InternalError
28
24
 
29
25
from loggerhead import util
30
 
from loggerhead.controllers import TemplatedBranchView
31
 
 
32
 
 
33
 
class ChangeLogUI(TemplatedBranchView):
34
 
 
35
 
    template_path = 'loggerhead.templates.changelog'
36
 
 
37
 
    def get_values(self, path, kwargs, headers):
38
 
        history = self._history
39
 
        revid = self.get_revid()
40
 
        filter_file_id = kwargs.get('filter_file_id', None)
41
 
        query = kwargs.get('q', None)
42
 
        start_revid = history.fix_revid(kwargs.get('start_revid', None))
43
 
        orig_start_revid = start_revid
44
 
        pagesize = 20#int(config.get('pagesize', '20'))
45
 
        search_failed = False
46
 
 
47
 
        if filter_file_id is None and path is not None:
48
 
            filter_file_id = history.get_file_id(revid, path)
49
 
 
 
26
from loggerhead.templatefunctions import templatefunctions
 
27
 
 
28
 
 
29
class ChangeLogUI (object):
 
30
    
 
31
    def __init__(self, branch):
 
32
        # BranchView object
 
33
        self._branch = branch
 
34
        self.log = branch.log
 
35
        
 
36
    @util.strip_whitespace
 
37
    @turbogears.expose(html='zpt:loggerhead.templates.changelog')
 
38
    def default(self, *args, **kw):
 
39
        z = time.time()
 
40
        h = self._branch.get_history()
 
41
        config = self._branch.config
 
42
 
 
43
        h._branch.lock_read()
50
44
        try:
51
 
            revid, start_revid, revid_list = history.get_view(
52
 
                revid, start_revid, filter_file_id, query)
53
 
            util.set_context(kwargs)
54
 
 
55
 
            if (query is not None) and (len(revid_list) == 0):
56
 
                search_failed = True
57
 
 
58
 
            if len(revid_list) == 0:
59
 
                scan_list = revid_list
 
45
            if len(args) > 0:
 
46
                revid = h.fix_revid(args[0])
60
47
            else:
61
 
                if revid in revid_list: # XXX is this always true?
62
 
                    i = revid_list.index(revid)
 
48
                revid = None
 
49
 
 
50
            filter_file_id = kw.get('filter_file_id', None)
 
51
            query = kw.get('q', None)
 
52
            start_revid = h.fix_revid(kw.get('start_revid', None))
 
53
            orig_start_revid = start_revid
 
54
            pagesize = int(config.get('pagesize', '20'))
 
55
            search_failed = False
 
56
 
 
57
            try:
 
58
                revid, start_revid, revid_list = h.get_view(
 
59
                    revid, start_revid, filter_file_id, query)
 
60
                kw['start_revid'] = start_revid
 
61
                util.set_context(kw)
 
62
 
 
63
                if (query is not None) and (len(revid_list) == 0):
 
64
                    search_failed = True
 
65
 
 
66
                if len(revid_list) == 0:
 
67
                    scan_list = revid_list
63
68
                else:
64
 
                    i = None
65
 
                scan_list = revid_list[i:]
66
 
            change_list = scan_list[:pagesize]
67
 
            changes = list(history.get_changes(change_list))
68
 
            data = {}
69
 
            for i, c in enumerate(changes):
70
 
                c.index = i
71
 
                data[str(i)] = urllib.quote(urllib.quote(c.revid, safe=''))
72
 
        except:
73
 
            self.log.exception('Exception fetching changes')
74
 
            raise HTTPServerError('Could not fetch changes')
75
 
 
76
 
        navigation = util.Container(
77
 
            pagesize=pagesize, revid=revid, start_revid=start_revid,
78
 
            revid_list=revid_list, filter_file_id=filter_file_id,
79
 
            scan_url='/changes', branch=self._branch, feed=True, history=history)
80
 
        if query is not None:
81
 
            navigation.query = query
82
 
        util.fill_in_navigation(navigation)
83
 
 
84
 
        # Directory Breadcrumbs
85
 
        directory_breadcrumbs = (
86
 
            util.directory_breadcrumbs(
87
 
                self._branch.friendly_name,
88
 
                self._branch.is_root,
89
 
                'changes'))
90
 
 
91
 
        return {
92
 
            'branch': self._branch,
93
 
            'changes': changes,
94
 
            'data': simplejson.dumps(data),
95
 
            'util': util,
96
 
            'history': history,
97
 
            'revid': revid,
98
 
            'navigation': navigation,
99
 
            'filter_file_id': filter_file_id,
100
 
            'start_revid': start_revid,
101
 
            'viewing_from': (orig_start_revid is not None) and 
102
 
                            (orig_start_revid != history.last_revid),
103
 
            'query': query,
104
 
            'search_failed': search_failed,
105
 
            'url': self._branch.context_url,
106
 
            'directory_breadcrumbs': directory_breadcrumbs,
107
 
        }
 
69
                    if revid in revid_list: # XXX is this always true?
 
70
                        i = revid_list.index(revid)
 
71
                    else:
 
72
                        i = None
 
73
                    scan_list = revid_list[i:]
 
74
                change_list = scan_list[:pagesize]
 
75
                changes = list(h.get_changes(change_list))
 
76
                h.add_changes(changes)
 
77
            except:
 
78
                self.log.exception('Exception fetching changes')
 
79
                raise InternalError('Could not fetch changes')
 
80
 
 
81
            navigation = util.Container(
 
82
                pagesize=pagesize, revid=revid, start_revid=start_revid,
 
83
                revid_list=revid_list, filter_file_id=filter_file_id,
 
84
                scan_url='/changes', branch=self._branch, feed=True)
 
85
            if query is not None:
 
86
                navigation.query = query
 
87
            util.fill_in_navigation(navigation)
 
88
 
 
89
            # add parent & merge-point branch-nick info, in case it's useful
 
90
            h.get_branch_nicks(changes)
 
91
 
 
92
            # does every change on this page have the same committer?  if so,
 
93
            # tell the template to show committer info in the "details block"
 
94
            # instead of on each line.
 
95
            all_same_author = True
 
96
 
 
97
            if changes:
 
98
                author = changes[0].author
 
99
                for e in changes[1:]:
 
100
                    if e.author != author:
 
101
                        all_same_author = False
 
102
                        break
 
103
 
 
104
            def url(pathargs, **kw):
 
105
                return self._branch.url(pathargs, **util.get_context(**kw))
 
106
 
 
107
            vals = {
 
108
                'branch': self._branch,
 
109
                'changes': changes,
 
110
                'util': util,
 
111
                'history': h,
 
112
                'revid': revid,
 
113
                'navigation': navigation,
 
114
                'filter_file_id': filter_file_id,
 
115
                'start_revid': start_revid,
 
116
                'viewing_from': (orig_start_revid is not None) and (orig_start_revid != h.last_revid),
 
117
                'query': query,
 
118
                'search_failed': search_failed,
 
119
                'all_same_author': all_same_author,
 
120
                'url': self._branch.context_url,
 
121
            }
 
122
            vals.update(templatefunctions)
 
123
            self.log.info('/changes %r: %r secs' % (revid, time.time() - z))
 
124
            return vals
 
125
        finally:
 
126
            h._branch.unlock()