55from django .conf import settings
66from django .contrib .syndication .feeds import Feed , FeedDoesNotExist
77from django .utils .feedgenerator import Atom1Feed
8- from django .core .exceptions import ObjectDoesNotExist
98from django .core .urlresolvers import reverse as urlreverse
10- from django .template .defaultfilters import truncatewords_html
9+ from django .utils .html import strip_tags
10+ from django .utils .text import truncate_words
1111
12- from ietf .idtracker .templatetags .ietf_filters import format_textarea , fill
13- from ietf .wgcharter .utils import *
1412from ietf .utils .history import find_history_active_at
15- from ietf .group .models import Group
16- from ietf .idrfc . views_doc import _get_html
13+ from ietf .group .models import Group , GroupEvent
14+ from ietf .doc . models import DocEvent
1715
18- def _get_history (wg , versions = None ):
19- results = []
20- for e in wg .charter .docevent_set .all ().order_by ('-time' ):
21- info = {}
22- charter_history = find_history_active_at (wg .charter , e .time )
23- info ['version' ] = charter_history .rev if charter_history else wg .charter .rev
24- info ['text' ] = e .desc
25- info ['by' ] = e .by .plain_name ()
26- info ['textSnippet' ] = truncatewords_html (format_textarea (fill (info ['text' ], 80 )), 25 )
27- info ['snipped' ] = info ['textSnippet' ][- 3 :] == "..."
28- if e .type == "new_revision" :
29- if charter_history :
30- charter = get_charter_for_revision (wg .charter , charter_history .rev )
31- group = get_group_for_revision (wg , charter_history .rev )
32- else :
33- charter = get_charter_for_revision (wg .charter , wg .charter .rev )
34- group = get_group_for_revision (wg , wg .charter .rev )
35-
36- if versions :
37- vl = [x ['rev' ] for x in versions ]
38- if vl :
39- prev_charter = get_charter_for_revision (wg .charter , vl [vl .index (charter .rev ) - 1 ])
40- else :
41- prev_charter = get_charter_for_revision (wg .charter , prev_revision (charter .rev ))
42- prev_group = get_group_for_revision (wg , prev_revision (charter .rev ))
43- results .append ({'comment' :e , 'info' :info , 'date' :e .time , 'group' : group ,
44- 'charter' : charter , 'prev_charter' : prev_charter ,
45- 'prev_group' : prev_group ,
46- 'txt_url' : settings .CHARTER_TXT_URL ,
47- 'is_rev' :True })
48- else :
49- results .append ({'comment' :e , 'info' :info , 'date' :e .time , 'group' : wg , 'is_com' :True })
50-
51- # convert plain dates to datetimes (required for sorting)
52- for x in results :
53- if not isinstance (x ['date' ], datetime .datetime ):
54- if x ['date' ]:
55- x ['date' ] = datetime .datetime .combine (x ['date' ], datetime .time (0 ,0 ,0 ))
56- else :
57- x ['date' ] = datetime .datetime (1970 ,1 ,1 )
58-
59- results .sort (key = lambda x : x ['date' ])
60- results .reverse ()
61- return results
62-
63- class GroupEvents (Feed ):
16+ class GroupChanges (Feed ):
6417 feed_type = Atom1Feed
65- title_template = "feeds/wg_charter_title.html"
66- description_template = "feeds/wg_charter_description.html"
18+ description_template = "feeds/group_description.html"
6719 def get_object (self , bits ):
6820 if len (bits ) != 1 :
6921 raise Group .DoesNotExist
7022 return Group .objects .get (acronym = bits [0 ])
7123
7224 def title (self , obj ):
73- return "WG changes for %s" % obj .acronym
25+ return u"Changes for %s %s " % ( obj .acronym , obj . type )
7426
7527 def link (self , obj ):
7628 if not obj :
@@ -81,34 +33,26 @@ def description(self, obj):
8133 return self .title (obj )
8234
8335 def items (self , obj ):
84- history = _get_history (obj )
85- for h in history :
86- gh = find_history_active_at (obj , h ['date' ])
87- if gh :
88- h ['chairs' ] = [x .person .plain_name () for x in gh .rolehistory_set .filter (name__slug = "chair" )]
89- h ['secr' ] = [x .person .plain_name () for x in gh .rolehistory_set .filter (name__slug = "secr" )]
90- h ['techadv' ] = [x .person .plain_name () for x in gh .rolehistory_set .filter (name__slug = "techadv" )]
91- else :
92- h ['chairs' ] = [x .person .plain_name () for x in obj .role_set .filter (name__slug = "chair" )]
93- h ['secr' ] = [x .person .plain_name () for x in obj .role_set .filter (name__slug = "secr" )]
94- h ['techadv' ] = [x .person .plain_name () for x in obj .role_set .filter (name__slug = "techadv" )]
95- dh = find_history_active_at (obj .charter , h ['date' ])
96- if dh :
97- h ['rev' ] = dh .rev
98- h ['charter' ] = _get_html (
99- str (dh .name )+ "-" + str (dh .rev )+ ",html" ,
100- os .path .join (dh .get_file_path (), dh .name + "-" + dh .rev + ".txt" ), False )
101- else :
102- h ['rev' ] = obj .charter .rev
103- h ['charter' ] = _get_html (
104- "charter-ietf-" + str (obj .acronym )+ "-" + str (obj .charter .rev )+ ",html" ,
105- os .path .join (obj .charter .get_file_path (), "charter-ietf-" + obj .acronym + "-" + obj .charter .rev + ".txt" ), False )
106- return history
36+ events = list (obj .groupevent_set .all ().select_related ("group" ))
37+ if obj .charter :
38+ events += list (obj .charter .docevent_set .all ())
39+
40+ events .sort (key = lambda e : (e .time , e .id ), reverse = True )
41+
42+ return events
10743
10844 def item_link (self , obj ):
109- return urlreverse ('wg_charter' , kwargs = {'acronym' : obj ['group' ].acronym })
45+ if isinstance (obj , DocEvent ):
46+ return urlreverse ("doc_view" , kwargs = {'name' : obj .doc_id })
47+ elif isinstance (obj , GroupEvent ):
48+ return urlreverse ('wg_charter' , kwargs = {'acronym' : obj .group .acronym })
11049
11150 def item_pubdate (self , obj ):
112- return obj [ 'date' ]
51+ return obj . time
11352
53+ def item_title (self , obj ):
54+ title = u"%s - %s" % (truncate_words (strip_tags (obj .desc ), 10 ), obj .by )
55+ if isinstance (obj , DocEvent ):
56+ title = u"Chartering: %s" % title
11457
58+ return title
0 commit comments