annotate website/issues/detectors/rsswriter.py @ 8040:19cef1e285b0

fix: remove delay when using csv export actions. The CSV file is written incrementally, so we can't determine the Content-Length. When using HTTP/1.1, this causes a delay while the browser waits for a timeout. Forcing the connection to close after the CSV file is written removes the delay. Ideally we should shift to chunked transfer encoding for these two actions, but that is much more invasive and when posting a request for CSV, it is unlikely that another request will be sent over the same socket.
author John Rouillard <rouilj@ieee.org>
date Tue, 18 Jun 2024 00:48:06 -0400
parents bed1313898d4
children
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.
6465
bed1313898d4 Force time format to include offset, use dc:creator not author
John Rouillard <rouilj@ieee.org>
parents: 6327
diff changeset
66 RSS20_DATE_FORMAT = '%a, %d %b %Y %H:%M:%S +0000'
6229
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")
6465
bed1313898d4 Force time format to include offset, use dc:creator not author
John Rouillard <rouilj@ieee.org>
parents: 6327
diff changeset
77 root.setAttribute("xmlns:dc","http://purl.org/dc/elements/1.1/")
6229
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
78
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
79 channel = root.appendChild(rss.createElement("channel"))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
80 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
81 def addElA(tag,attr):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
82 node=rss.createElement(tag)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
83 for attr, val in attr.items():
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
84 node.setAttribute(attr, val)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
85 channel.appendChild(node)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
86
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
87 addEl("title", title)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
88 addElA('atom:link', attr={"rel": "self",
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
89 "type": "application/rss+xml", "href": link + "@@file/rss.xml"})
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
90 addEl("link", link)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
91 addEl("description", description)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
92
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
93 return rss # has no items
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
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
96 def writeRss(db, cl, nodeid, olddata):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
97 """
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
98 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
99 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
100 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
101 rsswriter.newRss.
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
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
104 # The filename of a tracker's RSS feed. Tracker config variables
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
105 # are placed with the standard '%' operator syntax.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
106
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
107 FILENAME = "%s/rss.xml"%db.config['TEMPLATES']
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
108
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
109 # i.e., roundup.cgi/projects/_file/rss.xml
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
110 # FILENAME = "/home/markpasc/public_html/%(TRACKER_NAME)s.xml"
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
111
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
112 filename = FILENAME % db.config.__dict__
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
113
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
114 # 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
115 # 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
116 ##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
117 ## if __debug__:
c34171b2af43 Fix rss generator. No private atribute in issues in this tracker.
John Rouillard <rouilj@ieee.org>
parents: 6229
diff changeset
118 ## 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
119 ## return
6229
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
120
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
121 if __debug__:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
122 logger.debug("rss: generating rss for issue %s", nodeid)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
123
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
124 # open the RSS
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
125 import xml.dom.minidom
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
126 from xml.parsers.expat import ExpatError
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
127
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
128 try:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
129 rss = xml.dom.minidom.parse(filename)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
130 except IOError as e:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
131 if 2 != e.errno: raise
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
132 # File not found
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
133 rss = newRss(
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
134 "%s tracker" % (db.config.TRACKER_NAME,),
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
135 db.config.TRACKER_WEB,
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
136 "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
137 )
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
138 except ExpatError as e:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
139 if os.path.getsize(filename) == 0:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
140 # delete the file, it's broke
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
141 os.remove(filename)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
142 # create new rss file
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
143 rss = newRss(
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
144 "%s tracker" % (db.config.TRACKER_NAME,),
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
145 db.config.TRACKER_WEB,
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
146 "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
147 )
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
148 else:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
149 raise
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
150
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
151 channel = rss.documentElement.getElementsByTagName('channel')[0]
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
152 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
153 issuelink = '%sissue%s' % (db.config.TRACKER_WEB, nodeid)
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
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
156 if olddata:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
157 chg = cl.generateChangeNote(nodeid, olddata)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
158 else:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
159 chg = cl.generateCreateNote(nodeid)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
160
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
161 def addItem(desc, date, userid):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
162 """
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
163 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
164 link are those of the current issue.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
165
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
166 desc: the description text to use
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
167 date: an appropriately formatted string for pubDate
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
168 userid: a Roundup user ID to use as author
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
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
171 item = rss.createElement('item')
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
172
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
173 addEl(item, 'title', db.issue.get(nodeid, 'title'))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
174 addEl(item, 'link', issuelink)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
175 addEl(item, 'guid', issuelink + '#' + date.replace(' ','+'))
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
176 addEl(item, 'comments', issuelink)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
177 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
178 addEl(item, 'pubDate', date)
6465
bed1313898d4 Force time format to include offset, use dc:creator not author
John Rouillard <rouilj@ieee.org>
parents: 6327
diff changeset
179 # use dc:creator as username is not valid email address and
bed1313898d4 Force time format to include offset, use dc:creator not author
John Rouillard <rouilj@ieee.org>
parents: 6327
diff changeset
180 # author element must be valid email address
bed1313898d4 Force time format to include offset, use dc:creator not author
John Rouillard <rouilj@ieee.org>
parents: 6327
diff changeset
181 # addEl(item, 'author',
bed1313898d4 Force time format to include offset, use dc:creator not author
John Rouillard <rouilj@ieee.org>
parents: 6327
diff changeset
182 addEl(item, 'dc:creator',
6327
0014af559224 do not include email address in rss feed. Username only.
John Rouillard <rouilj@ieee.org>
parents: 6308
diff changeset
183 '%s' % (
6229
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
184 db.user.get(userid, 'username')
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 )
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
187
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
188 channel.appendChild(item)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
189
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
190 # add detectors directory to path if it's not there.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
191 # FIXME - see if this pollutes the sys.path for other
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
192 # trackers.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
193 detector_path="%s/detectors"%(db.config.TRACKER_HOME)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
194 if ( sys.path.count(detector_path) == 0 ):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
195 sys.path.insert(0,detector_path)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
196
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
197 from nosyreaction import determineNewMessages
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
198 for msgid in determineNewMessages(cl, nodeid, olddata):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
199 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
200 desc = db.msg.get(msgid, 'content')
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
201
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
202 if desc and chg:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
203 desc += chg
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
204 elif chg:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
205 desc = chg
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
206 chg = None
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
207
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
208 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
209
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
210 if chg:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
211 from time import strftime
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
212 addItem(chg.replace('\n----------\n', ''), strftime(RSS20_DATE_FORMAT), db.getuid())
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
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
215 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
216 channel.removeChild(c)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
217
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
218 # write the RSS
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
219 out = open(filename, 'w')
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
220
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
221 try:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
222 out.write(rss.toxml())
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
223 except Exception as e:
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
224 # record the falure This should not happen.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
225 logger.error(e)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
226 out.close() # create 0 length file maybe?? But we handle above.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
227 raise # let the user know something went wrong.
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
228
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
229 out.close()
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
230
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
231
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
232 def init(db):
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
233 db.issue.react('create', writeRss)
461a322a79af issue2551085 - add rss feed
John Rouillard <rouilj@ieee.org>
parents:
diff changeset
234 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
235 #SHA: c4f916a13d533ff0c49386fc4f1f9f254adeb744

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