annotate website/issues/detectors/rsswriter.py @ 6414:3dbf1bc5e567

issue2551120 - The sorted method of MultilinkHTMLProperty crashes ... if the given property is unset for an element of the list. Crash fixed. New feature NoneFirst added to method to make unset values sort at start or end of sorted list. Current testing framework for this code is insuffient for testing change. Committing without automated test because it solves a crash.
author John Rouillard <rouilj@ieee.org>
date Mon, 17 May 2021 15:25:17 -0400
parents 0014af559224
children bed1313898d4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6229
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
1 #!/usr/bin/python
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
2
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
3 #
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
4 # RSS writer Roundup reactor
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
5 # Mark Paschal <markpasc@markpasc.org>
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
6 #
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
7
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
8 import os
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
9
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
10 import logging
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
11 logger = logging.getLogger('detector')
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
12
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
13 import sys
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
14
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
15 # How many <item>s to have in the feed, at most.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
16 MAX_ITEMS = 30
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
17
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
18 #
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
19 # Module metadata
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
20 #
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
21
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
22 __author__ = "Mark Paschal <markpasc@markpasc.org>"
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
23 __copyright__ = "Copyright 2003 Mark Paschal"
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
24 __version__ = "1.2"
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
25
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
26 __changes__ = """
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
27 1.1 29 Aug 2003 Produces valid pubDates. Produces pubDates and authors for
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
28 change notes. Consolidates a message and change note into one
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
29 item. Uses TRACKER_NAME in filename to produce one feed per
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
30 tracker. Keeps to MAX_ITEMS limit more efficiently.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
31 1.2 5 Sep 2003 Fixes bug with programmatically submitted issues having
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
32 messages without summaries (?!).
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
33 x.x 26 Feb 2017 John Rouillard try to deal with truncation of rss
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
34 file cause by error in parsing 8'bit characcters in
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
35 input message. Further attempts to fix issue by
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
36 modifying message bail on 0 length rss file. Delete
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
37 it and retry.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
38 """
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
39
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
40 __license__ = 'MIT'
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
41
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
42 #
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
43 # Copyright 2003 Mark Paschal
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
44 #
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
45 # Permission is hereby granted, free of charge, to any person obtaining a copy
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
46 # of this software and associated documentation files (the "Software"), to deal
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
47 # in the Software without restriction, including without limitation the rights
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
48 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
49 # copies of the Software, and to permit persons to whom the Software is
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
50 # furnished to do so, subject to the following conditions:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
51 #
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
52 # The above copyright notice and this permission notice shall be included in all
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
53 # copies or substantial portions of the Software.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
54 #
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
55 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
56 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
57 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
58 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
59 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
60 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
61 # SOFTWARE.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
62 #
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
63
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
64
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
65 # The strftime format to use for <pubDate>s.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
66 RSS20_DATE_FORMAT = '%a, %d %b %Y %H:%M:%S %z'
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
67
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
68
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
69 def newRss(title, link, description):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
70 """Returns an XML Document containing an RSS 2.0 feed with no items."""
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
71 import xml.dom.minidom
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
72 rss = xml.dom.minidom.Document()
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
73
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
74 root = rss.appendChild(rss.createElement("rss"))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
75 root.setAttribute("version", "2.0")
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
76 root.setAttribute("xmlns:atom","http://www.w3.org/2005/Atom")
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
77
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
78 channel = root.appendChild(rss.createElement("channel"))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
79 addEl = lambda tag,value: channel.appendChild(rss.createElement(tag)).appendChild(rss.createTextNode(value))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
80 def addElA(tag,attr):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
81 node=rss.createElement(tag)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
82 for attr, val in attr.items():
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
83 node.setAttribute(attr, val)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
84 channel.appendChild(node)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
85
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
86 addEl("title", title)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
87 addElA('atom:link', attr={"rel": "self",
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
88 "type": "application/rss+xml", "href": link + "@@file/rss.xml"})
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
89 addEl("link", link)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
90 addEl("description", description)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
91
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
92 return rss # has no items
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
93
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
94
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
95 def writeRss(db, cl, nodeid, olddata):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
96 """
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
97 Reacts to a created or changed issue. Puts new messages and the change note
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
98 in items in the RSS feed, as determined by the rsswriter.py FILENAME setting.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
99 If no RSS feed exists where FILENAME specifies, a new feed is created with
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
100 rsswriter.newRss.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
101 """
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
102
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
103 # The filename of a tracker's RSS feed. Tracker config variables
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
104 # are placed with the standard '%' operator syntax.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
105
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
106 FILENAME = "%s/rss.xml"%db.config['TEMPLATES']
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
107
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
108 # i.e., roundup.cgi/projects/_file/rss.xml
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
109 # FILENAME = "/home/markpasc/public_html/%(TRACKER_NAME)s.xml"
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
110
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
111 filename = FILENAME % db.config.__dict__
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
112
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
113 # return if issue is private
6308
c34171b2af43 Fix rss generator. No private atribute in issues in this tracker.
John Rouillard <rouilj@ieee.org>
parents: 6229
diff changeset
114 # enable when private property is added
c34171b2af43 Fix rss generator. No private atribute in issues in this tracker.
John Rouillard <rouilj@ieee.org>
parents: 6229
diff changeset
115 ##if ( db.issue.get(nodeid, 'private') ):
c34171b2af43 Fix rss generator. No private atribute in issues in this tracker.
John Rouillard <rouilj@ieee.org>
parents: 6229
diff changeset
116 ## if __debug__:
c34171b2af43 Fix rss generator. No private atribute in issues in this tracker.
John Rouillard <rouilj@ieee.org>
parents: 6229
diff changeset
117 ## logger.debug("rss: Private issue. not generating rss")
c34171b2af43 Fix rss generator. No private atribute in issues in this tracker.
John Rouillard <rouilj@ieee.org>
parents: 6229
diff changeset
118 ## return
6229
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
119
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
120 if __debug__:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
121 logger.debug("rss: generating rss for issue %s", nodeid)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
122
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
123 # open the RSS
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
124 import xml.dom.minidom
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
125 from xml.parsers.expat import ExpatError
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
126
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
127 try:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
128 rss = xml.dom.minidom.parse(filename)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
129 except IOError as e:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
130 if 2 != e.errno: raise
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
131 # File not found
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
132 rss = newRss(
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
133 "%s tracker" % (db.config.TRACKER_NAME,),
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
134 db.config.TRACKER_WEB,
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
135 "Recent changes to the %s Roundup issue tracker" % (db.config.TRACKER_NAME,)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
136 )
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
137 except ExpatError as e:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
138 if os.path.getsize(filename) == 0:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
139 # delete the file, it's broke
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
140 os.remove(filename)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
141 # create new rss file
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
142 rss = newRss(
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
143 "%s tracker" % (db.config.TRACKER_NAME,),
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
144 db.config.TRACKER_WEB,
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
145 "Recent changes to the %s Roundup issue tracker" % (db.config.TRACKER_NAME,)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
146 )
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
147 else:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
148 raise
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
149
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
150 channel = rss.documentElement.getElementsByTagName('channel')[0]
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
151 addEl = lambda parent,tag,value: parent.appendChild(rss.createElement(tag)).appendChild(rss.createTextNode(value))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
152 issuelink = '%sissue%s' % (db.config.TRACKER_WEB, nodeid)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
153
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
154
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
155 if olddata:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
156 chg = cl.generateChangeNote(nodeid, olddata)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
157 else:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
158 chg = cl.generateCreateNote(nodeid)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
159
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
160 def addItem(desc, date, userid):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
161 """
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
162 Adds an RSS item to the RSS document. The title, link, and comments
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
163 link are those of the current issue.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
164
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
165 desc: the description text to use
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
166 date: an appropriately formatted string for pubDate
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
167 userid: a Roundup user ID to use as author
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
168 """
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
169
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
170 item = rss.createElement('item')
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
171
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
172 addEl(item, 'title', db.issue.get(nodeid, 'title'))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
173 addEl(item, 'link', issuelink)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
174 addEl(item, 'guid', issuelink + '#' + date.replace(' ','+'))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
175 addEl(item, 'comments', issuelink)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
176 addEl(item, 'description', desc.replace('&','&amp;').replace('<','&lt;').replace('\n', '<br>\n'))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
177 addEl(item, 'pubDate', date)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
178 addEl(item, 'author',
6327
0014af559224 do not include email address in rss feed. Username only.
John Rouillard <rouilj@ieee.org>
parents: 6308
diff changeset
179 '%s' % (
6229
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
180 db.user.get(userid, 'username')
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
181 )
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
182 )
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
183
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
184 channel.appendChild(item)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
185
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
186 # add detectors directory to path if it's not there.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
187 # FIXME - see if this pollutes the sys.path for other
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
188 # trackers.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
189 detector_path="%s/detectors"%(db.config.TRACKER_HOME)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
190 if ( sys.path.count(detector_path) == 0 ):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
191 sys.path.insert(0,detector_path)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
192
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
193 from nosyreaction import determineNewMessages
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
194 for msgid in determineNewMessages(cl, nodeid, olddata):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
195 logger.debug("Processing new message msg%s for issue%s", msgid, nodeid)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
196 desc = db.msg.get(msgid, 'content')
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
197
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
198 if desc and chg:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
199 desc += chg
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
200 elif chg:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
201 desc = chg
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
202 chg = None
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
203
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
204 addItem(desc or '', db.msg.get(msgid, 'date').pretty(RSS20_DATE_FORMAT), db.msg.get(msgid, 'author'))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
205
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
206 if chg:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
207 from time import strftime
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
208 addItem(chg.replace('\n----------\n', ''), strftime(RSS20_DATE_FORMAT), db.getuid())
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
209
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
210
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
211 for c in channel.getElementsByTagName('item')[0:-MAX_ITEMS]: # leaves at most MAX_ITEMS at the end
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
212 channel.removeChild(c)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
213
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
214 # write the RSS
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
215 out = open(filename, 'w')
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
216
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
217 try:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
218 out.write(rss.toxml())
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
219 except Exception as e:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
220 # record the falure This should not happen.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
221 logger.error(e)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
222 out.close() # create 0 length file maybe?? But we handle above.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
223 raise # let the user know something went wrong.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
224
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
225 out.close()
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
226
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
227
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
228 def init(db):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
229 db.issue.react('create', writeRss)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
230 db.issue.react('set', writeRss)
6308
c34171b2af43 Fix rss generator. No private atribute in issues in this tracker.
John Rouillard <rouilj@ieee.org>
parents: 6229
diff changeset
231 #SHA: c4f916a13d533ff0c49386fc4f1f9f254adeb744

Roundup Issue Tracker: http://roundup-tracker.org/