@@ -92,7 +92,7 @@ def get_file_path(self):
9292 else :
9393 return settings .DOCUMENT_PATH_PATTERN .format (doc = self )
9494
95- def href (self ):
95+ def href (self , meeting = None ):
9696 """
9797 Returns an url to the document text. This differs from .get_absolute_url(),
9898 which returns an url to the datatracker page for the document.
@@ -105,31 +105,44 @@ def href(self):
105105 # better named, or regularize the filename based on self.name
106106 if not hasattr (self , '_cached_href' ):
107107 validator = URLValidator ()
108- try :
109- validator (self .external_url )
110- return self .external_url
111- except ValidationError :
112- pass
113-
114- meeting_related = self .meeting_related ()
108+ if self .external_url and self .external_url .split (':' )[0 ] in validator .schemes :
109+ try :
110+ validator (self .external_url )
111+ return self .external_url
112+ except ValidationError :
113+ pass
115114
116- settings_var = settings .DOC_HREFS
117- if meeting_related :
118- settings_var = settings .MEETING_DOC_HREFS
119115
120- try :
121- format = settings_var [self .type_id ]
122- except KeyError :
116+ if self .type_id in settings .DOC_HREFS and self .type_id in settings .MEETING_DOC_HREFS :
117+ if self .meeting_related ():
118+ self .is_meeting_related = True
119+ format = settings .MEETING_DOC_HREFS [self .type_id ]
120+ else :
121+ self .is_meeting_related = False
122+ format = settings .DOC_HREFS [self .type_id ]
123+ elif self .type_id in settings .DOC_HREFS :
124+ self .is_meeting_related = False
125+ format = settings .DOC_HREFS [self .type_id ]
126+ elif self .type_id in settings .MEETING_DOC_HREFS :
127+ self .is_meeting_related = True
128+ format = settings .MEETING_DOC_HREFS [self .type_id ]
129+ else :
123130 if len (self .external_url ):
124131 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
132+ else :
133+ return None
134+
135+ if self .is_meeting_related :
136+ if not meeting :
137+ # we need to do this because DocHistory items don't have
138+ # any session_set entry:
139+ doc = self .doc if isinstance (self , DocHistory ) else self
140+ meeting = doc .session_set .first ().meeting
141+ info = dict (doc = self , meeting = meeting )
142+ else :
143+ info = dict (doc = self )
131144
132- self ._cached_href = format .format (doc = self , meeting = meeting )
145+ self ._cached_href = format .format (** info )
133146 return self ._cached_href
134147
135148 def set_state (self , state ):
@@ -424,20 +437,21 @@ def latest_event(self, *args, **filter_args):
424437 return e [0 ] if e else None
425438
426439 def canonical_name (self ):
427- from ietf .doc .utils_charter import charter_name_for_group # Imported locally to avoid circular imports
428- if hasattr (self , '_canonical_name' ):
429- return self ._canonical_name
430- name = self .name
431- if self .type_id == "draft" and self .get_state_slug () == "rfc" :
432- a = self .docalias_set .filter (name__startswith = "rfc" )
433- if a :
434- name = a [0 ].name
435- elif self .type_id == "charter" :
436- try :
437- name = charter_name_for_group (self .chartered_group )
438- except Group .DoesNotExist :
439- pass
440- return name
440+ if not hasattr (self , '_canonical_name' ):
441+ name = self .name
442+ if self .type_id == "draft" and self .get_state_slug () == "rfc" :
443+ a = self .docalias_set .filter (name__startswith = "rfc" )
444+ if a :
445+ name = a [0 ].name
446+ elif self .type_id == "charter" :
447+ from ietf .doc .utils_charter import charter_name_for_group # Imported locally to avoid circular imports
448+ try :
449+ name = charter_name_for_group (self .chartered_group )
450+ except Group .DoesNotExist :
451+ pass
452+ self ._canonical_name = name
453+ return self ._canonical_name
454+
441455
442456 def canonical_docalias (self ):
443457 return self .docalias_set .get (name = self .name )
0 commit comments