Ticket #807: pollmacro.patch
| File pollmacro.patch, 5.3 kB (added by JamesMills, 2 years ago) |
|---|
-
tracpoll/tracpoll.py
old new 7 7 from trac.util import sorted, escape 8 8 from trac.wiki.formatter import wiki_to_oneliner 9 9 from trac.web.chrome import ITemplateProvider, add_stylesheet 10 from tractags.parseargs import parseargs 10 11 11 12 class Poll(object): 12 def __init__(self, base_dir, title, vote_defs):13 def __init__(self, base_dir, title, format, vote_defs): 13 14 self.vote_defs = vote_defs 14 15 self.title = title 16 self.format = format 15 17 # Perhaps the Wiki page name should be included? 16 18 self.key = ''.join(re.findall(r'(\w+)', title)).lower() 17 19 self.store = os.path.join(base_dir, self.key + '.poll') … … 56 58 out.write('<form id="%(id)s" method="get" action="%(href)s#%(id)s">\n' 57 59 '<input type="hidden" name="poll" value="%(id)s"/>\n' 58 60 % {'id': self.key, 'href': env.href(req.path_info)}) 59 out.write('<fieldset class="poll">\n' 60 ' <legend>%s</legend>\n' 61 ' <ul>\n' 62 % escape(self.title)) 61 if self.format == 'singleline': 62 out.write('<fieldset class="poll">\n' 63 ' <legend>%s</legend>\n' 64 % escape(self.title)) 65 else: 66 out.write('<fieldset class="poll">\n' 67 ' <legend>%s</legend>\n' 68 ' <ul>\n' 69 % escape(self.title)) 63 70 username = req.authname or 'anonymous' 64 71 for id, style, vote in self.vote_defs: 65 72 hid = escape(str(id)) 66 out.write('<li%s>\n' % (style and ' class="%s"' % style or '')) 73 if self.format == "singleline": 74 out.write('%s ' % (style and ' class="%s"' % style or '')) 75 else: 76 out.write('<li%s>\n' % (style and ' class="%s"' % style or '')) 67 77 if can_vote: 68 78 checked = username in self.votes[id] 69 79 out.write('<input type="radio" name="vote" id="%(pvid)s" value="%(vid)s"%(checked)s/>\n' … … 78 88 out.write(' <span class="voters">(<span class="voter">' + 79 89 '</span>, <span class="voter">'.join(self.votes[id]) + 80 90 '</span>)</span>') 81 out.write('</li>\n') 91 if self.format == "singleline": 92 pass 93 else: 94 out.write('</li>\n') 82 95 can_vote and out.write('<input type="submit" value="Vote"/>') 83 out.write(' </ul>\n</fieldset>\n') 96 if self.format == "singleline": 97 out.write('\n</fieldset>\n') 98 else: 99 out.write(' </ul>\n</fieldset>\n') 84 100 can_vote and out.write('</form>\n') 85 101 return out.getvalue() 86 102 … … 115 131 new-line (if used as a processor). The first argument is the title of the 116 132 poll, which is also the identifier for each poll. 117 133 118 Usage: `[[TicketPoll( <title>; <arg> [; <arg>] ...)]]`134 Usage: `[[TicketPoll(format, <title>; <arg> [; <arg>] ...)]]` 119 135 136 "format" can be one of: 137 * default 138 * singleline 139 120 140 Where <arg> conforms to the following: 121 141 122 142 || '''<arg>''' || '''Description''' || … … 134 154 base_dir = property(lambda self: self.env.config.get('poll', 'base_dir', '/tmp')) 135 155 136 156 def render_macro(self, req, name, content): 157 args, kwargs = self._split_macro_args(content) 158 self.env.log.debug("args: %s" % args) 159 self.env.log.debug("kwargs: %s" % args) 160 try: 161 format = kwargs['format'] 162 content = re.sub("format ?= ?%s, ?(?imus)" % format, "", content) 163 except KeyError: 164 format = 'default' 165 137 166 content = filter(None, [i.strip() for i in 138 167 content.replace(';', '\n').split('\n')]) 168 self.env.log.debug("content: %s" % content) 139 169 title = content.pop(0) 140 return self.render_poll(req, title, content)170 return self.render_poll(req, title, format, content) 141 171 142 def render_poll(self, req, title, votes): 172 def _split_macro_args(self, argv): 173 """Return a list of arguments and a dictionary of keyword arguments 174 """ 175 args = [] 176 kwargs = {} 177 if argv: 178 args, kwargs = parseargs(argv) 179 return args, kwargs 180 181 def render_poll(self, req, title, format, votes): 143 182 from trac.ticket.model import Ticket, Priority 144 183 from trac.ticket.query import Query 145 184 add_stylesheet(req, 'poll/css/poll.css') … … 183 222 if not all_votes: 184 223 raise TracError('No votes provided') 185 224 186 poll = Poll(self.base_dir, title, all_votes)225 poll = Poll(self.base_dir, title, format, all_votes) 187 226 if req.perm.has_permission('POLL_VOTE'): 188 227 poll.populate(req) 189 228 return poll.render(self.env, req) -
setup.py
old new 1 1 from setuptools import setup 2 2 3 3 setup(name='TracPoll', 4 version='0. 1',4 version='0.2', 5 5 packages=['tracpoll'], 6 6 entry_points = {'trac.plugins': ['tracpoll = tracpoll']}, 7 7 author='Alec Thomas',
