def index(self): ''' Print up an index of the available trackers ''' keys = list(self.TRACKER_HOMES.keys()) if len(keys) == 1: self.send_response(302) self.send_header('Location', urllib_.quote(keys[0]) + '/index') self.end_headers() else: self.send_response(200) self.send_header('Content-Type', 'text/html') self.end_headers() w = self.wfile.write if self.CONFIG and self.CONFIG['TEMPLATE']: template = open(self.CONFIG['TEMPLATE']).read() pt = PageTemplate() pt.write(template) extra = { 'trackers': self.TRACKERS, 'nothing' : None, 'true' : 1, 'false' : 0, } w(s2b(pt.pt_render(extra_context=extra))) else: w(s2b(_('<html><head><title>Roundup trackers index</title></head>\n' '<body><h1>Roundup trackers index</h1><ol>\n'))) keys.sort() for tracker in keys: w(s2b('<li><a href="%(tracker_url)s/index">%(tracker_name)s</a>\n'%{ 'tracker_url': urllib_.quote(tracker), 'tracker_name': html_escape(tracker)})) w(b'</ol></body></html>')
def handle(self): ''' Perform some action. No return value is required. ''' if self.client.env['REQUEST_METHOD'] != 'POST': raise Reject(self._('Invalid request')) # parse the props from the form try: props, links = self.client.parsePropsFromForm(create=1) except (ValueError, KeyError) as message: self.client.add_error_message(self._('Error: %s') % str(message)) return print props print props[('project', self.form['projectid'].value)]['supplier'] try: message = self._editnodes(props, links) except (ValueError, KeyError, IndexError, Reject) as message: escape = not isinstance(message, RejectRaw) self.client.add_error_message(self._('Edit Error: %s') % str(message), escape=escape) return self.db.project.set(self.form['projectid'].value, status='5') # Set project status to 'in-progress' #insert task(s) for task in self.db.workflow.filter(None, filterspec={ 'workflowname': '1', 'trg_type': None, 'trg_state': None }): t = self.db.issue.create( project=self.form['projectid'].value, tasktype=self.db.workflow.get(task, 'new_type'), status='new', supplier=self.db.workflow.get(task, 'new_resp') if self.db.workflow.get(task, 'new_resp') else props[('project', self.form['projectid'].value)]['supplier']) # commit now that all the tricky stuff is done self.db.commit() # redirect to the item's edit page # redirect to finish off url = self.base + self.classname # note that this action might have been called by an index page, so # we will want to include index-page args in this URL too if self.nodeid is not None: url += self.nodeid url += '?@ok_message=%s&@template=%s' % (urllib_.quote( 'Project%s launched.' % (self.form['projectid'].value)), urllib_.quote(self.template)) if self.nodeid is None: req = templating.HTMLRequest(self.client) print self.form['projectid'].value url += '&' + req.indexargs_url('', {})[1:] raise exceptions.Redirect(url)
def finishRego(self): # log the new user in self.client.userid = self.userid user = self.client.user = self.db.user.get(self.userid, "username") # re-open the database for real, using the user self.client.opendb(user) # update session data self.client.session_api.set(user=user) # nice message message = self._("You are now registered, welcome!") url = "%suser%s?@ok_message=%s" % (self.base, self.userid, urllib_.quote(message)) # redirect to the user's page (but not 302, as some email clients seem # to want to reload the page, or something) return """<html><head><title>%s</title></head> <body><p><a href="%s">%s</a></p> <script type="text/javascript"> window.setTimeout('window.location = "%s"', 1000); </script>""" % ( message, url, message, url, )
def finishRego(self): # log the new user in self.client.userid = self.userid user = self.client.user = self.db.user.get(self.userid, 'username') # re-open the database for real, using the user self.client.opendb(user) # update session data self.client.session_api.set(user=user) # nice message message = self._('You are now registered, welcome!') url = '%suser%s?@ok_message=%s' % (self.base, self.userid, urllib_.quote(message)) # redirect to the user's page (but not 302, as some email clients seem # to want to reload the page, or something) return '''<html><head><title>%s</title></head> <body><p><a href="%s">%s</a></p> <script type="text/javascript"> window.setTimeout('window.location = "%s"', 1000); </script>''' % (message, url, message, url)
# handle the props - edit or create try: # when it hits the None element, it'll set self.nodeid messages = self._editnodes(props, links) except (ValueError, KeyError, IndexError, roundup.exceptions.Reject), message: # these errors might just be indicative of user dumbness self.client.error_message.append(_('Error: %s') % str(message)) return # commit now that all the tricky stuff is done self.db.commit() # redirect to the new item's page raise exceptions.Redirect('%s%s%s?@ok_message=%s&@template=%s' % ( self.base, self.classname, self.nodeid, urllib_.quote(messages), urllib_.quote(self.template))) class PassResetAction(Action): def handle(self): """Handle password reset requests. Presence of either "name" or "address" generates email. Presence of "otk" performs the reset. """ otks = self.db.getOTKManager() if 'otk' in self.form: # pull the rego information out of the otk database otk = self.form['otk'].value uid = otks.get(otk, 'uid', default=None)
class EditItemAction(EditCommon): def lastUserActivity(self): if ':lastactivity' in self.form: d = date.Date(self.form[':lastactivity'].value) elif '@lastactivity' in self.form: d = date.Date(self.form['@lastactivity'].value) else: return None d.second = int(d.second) return d def lastNodeActivity(self): cl = getattr(self.client.db, self.classname) activity = cl.get(self.nodeid, 'activity').local(0) activity.second = int(activity.second) return activity def detectCollision(self, user_activity, node_activity): '''Check for a collision and return the list of props we edited that conflict.''' if user_activity and user_activity < node_activity: props, links = self.client.parsePropsFromForm() key = (self.classname, self.nodeid) # we really only collide for direct prop edit conflicts return list(props[key]) else: return [] def handleCollision(self, props): message = self._( 'Edit Error: someone else has edited this %s (%s). ' 'View <a target="new" href="%s%s">their changes</a> ' 'in a new window.') % (self.classname, ', '.join(props), self.classname, self.nodeid) self.client.add_error_message(message, escape=False) return def handle(self): """Perform an edit of an item in the database. See parsePropsFromForm and _editnodes for special variables. """ # ensure modification comes via POST if self.client.env['REQUEST_METHOD'] != 'POST': raise roundup.exceptions.Reject(self._('Invalid request')) user_activity = self.lastUserActivity() if user_activity: props = self.detectCollision(user_activity, self.lastNodeActivity()) if props: self.handleCollision(props) return props, links = self.client.parsePropsFromForm() # handle the props try: message = self._editnodes(props, links) except (ValueError, KeyError, IndexError, roundup.exceptions.Reject), message: self.client.add_error_message( self._('Edit Error: %s') % str(message)) return # commit now that all the tricky stuff is done self.db.commit() # redirect to the item's edit page # redirect to finish off url = self.base + self.classname # note that this action might have been called by an index page, so # we will want to include index-page args in this URL too if self.nodeid is not None: url += self.nodeid url += '?@ok_message=%s&@template=%s' % (urllib_.quote(message), urllib_.quote(self.template)) if self.nodeid is None: req = templating.HTMLRequest(self.client) url += '&' + req.indexargs_url('', {})[1:] raise exceptions.Redirect(url)
try: # when it hits the None element, it'll set self.nodeid messages = self._editnodes(props, links) except (ValueError, KeyError, IndexError, roundup.exceptions.Reject), message: # these errors might just be indicative of user dumbness self.client.add_error_message(_('Error: %s') % str(message)) return # commit now that all the tricky stuff is done self.db.commit() # redirect to the new item's page raise exceptions.Redirect( '%s%s%s?@ok_message=%s&@template=%s' % (self.base, self.classname, self.nodeid, urllib_.quote(messages), urllib_.quote(self.template))) class PassResetAction(Action): def handle(self): """Handle password reset requests. Presence of either "name" or "address" generates email. Presence of "otk" performs the reset. """ otks = self.db.getOTKManager() if 'otk' in self.form: # pull the rego information out of the otk database otk = self.form['otk'].value