@@ -103,32 +103,34 @@ def href(self):
103103 # break things all over the place.
104104 # XXX TODO: move all non-URL 'external_url' values into a field which is
105105 # better named, or regularize the filename based on self.name
106- validator = URLValidator ()
107- try :
108- validator (self .external_url )
109- return self .external_url
110- except ValidationError :
111- pass
112-
113- meeting_related = self .meeting_related ()
114-
115- settings_var = settings .DOC_HREFS
116- if meeting_related :
117- settings_var = settings .MEETING_DOC_HREFS
118-
119- try :
120- format = settings_var [self .type_id ]
121- except KeyError :
122- if len (self .external_url ):
106+ if not hasattr (self , '_cached_href' ):
107+ validator = URLValidator ()
108+ try :
109+ validator (self .external_url )
123110 return self .external_url
124- return None
111+ except ValidationError :
112+ pass
125113
126- meeting = None
127- if meeting_related :
128- doc = self .doc if isinstance (self , DocHistory ) else self
129- meeting = doc .session_set .first ().meeting
114+ meeting_related = self .meeting_related ()
115+
116+ settings_var = settings .DOC_HREFS
117+ if meeting_related :
118+ settings_var = settings .MEETING_DOC_HREFS
130119
131- return format .format (doc = self ,meeting = meeting )
120+ try :
121+ format = settings_var [self .type_id ]
122+ except KeyError :
123+ if len (self .external_url ):
124+ return self .external_url
125+ return None
126+
127+ meeting = None
128+ if meeting_related :
129+ doc = self .doc if isinstance (self , DocHistory ) else self
130+ meeting = doc .session_set .first ().meeting
131+
132+ self ._cached_href = format .format (doc = self ,meeting = meeting )
133+ return self ._cached_href
132134
133135 def set_state (self , state ):
134136 """Switch state type implicit in state to state. This just
0 commit comments