def uploadlogo( self, environ ) : """Action to upload site logo file""" from zeta.config.environment import vfcomp, userscomp c.rclose = h.ZResp() # Form handling def errhandler(errmsg) : c.errmsg = errmsg vfcomp.process( request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=[ 'sitelogo'] ) c.title = 'SiteLogo' # Html page generation if c.errmsg : html = self.returnerrmsg(environ) elif c.form == 'submit' : h.redirect_url( h.url_siteadmin ) else : html = render( '/derived/siteadmin/sitelogo.html' ) c.rclose.append(html) return html
def create( self, environ ) : """Create and host a new project URLS : /p/newproject?form=request&formname=createprj /p/newproject?form=submit&formname=createprj """ from zeta.config.environment import liccomp, projcomp, vfcomp c.rclose = h.ZResp() # Form handling def errhandler(errmsg) : c.errmsg = errmsg vfcomp.process( request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=['createprj'], user=c.authuser ) # Setup context for page generation c.licensenames = sorted([ l[1] for l in liccomp.licensefields() ]) c.projectnames = projcomp.projectnames c.liceditable = h.authorized( h.HasPermname(['LICENSE_CREATE']) ) c.title = 'CreateProject' # Html page generation if c.errmsg : html = self.returnerrmsg(environ) elif c.form == 'submit' : h.redirect_url( h.url_createprj ) else : html = render( '/derived/projects/create.html' ) c.rclose.append(html) return c.rclose
def create(self, environ, projectname): """Create a new project review URLS : /p/{projectname}/r/createrevw?form=request&formname=createrev /p/{projectname}/r/createrevw?form=submit&formname=createrev """ from zeta.config.environment import projcomp, userscomp, vcscomp, vfcomp cfok = lambda cf : ( cf['mime_type'] != 'text/directory' ) and \ ( cf['changetype'] != 'deleted' ) c.rclose = h.ZResp() # Handle forms def errhandler(errmsg): c.errmsg = errmsg vfcomp.process(request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=['createrev'], user=c.authuser) # Setup context for page generation c.projsummary = c.project.summary c.projusers = self.projusers(c.project) c.usernames = sorted(userscomp.usernames) c.rsets = [[rs.id, rs.name] for rs in c.project.reviewsets] c.forsrc = request.params.getall('rurl') c.forversion = request.params.get('ver', None) c.forversion = int(c.forversion) if c.forversion != None else None vcsid = request.params.get('vcsid', None) c.vcs = vcsid and vcscomp.get_vcs(int(vcsid)) c.vrep = c.vcs and va.open_repository(c.vcs) c.title = 'CreateReview' if c.vrep: c.changedfiles = c.vrep.changedfiles(c.vcs.rooturl, revstart=c.forversion - 1, revend=c.forversion) c.forsrc = [ join(c.vcs.rooturl, cf['repos_path'].lstrip('/')) for cf in c.changedfiles if cfok(cf) ] # HTML page generation if c.errmsg: html = self.returnerrmsg(environ) elif c.form == 'submit' and c.formname == 'createrev': # Skip breadcrumbing, if it is a form submit c.title = '-Skip-' h.redirect_url(h.url_revwcreate) else: html = render('/derived/projects/reviewcreate.html') c.rclose.append(html) return c.rclose
def signout( self, environ ) : """User logout - Actual action is perfromed by MultiGate, including the removal of user session. URLS : /accounts/signout """ h.redirect_url( h.url_sitehome )
def newaccount( self, environ ) : """Create new user account URLS : /accounts/newaccount?form=request&formname=createuser /accounts/newaccount?form=request&formname=createuser&digest=<digest> /accounts/newaccount?form=submit&formname=createuser /accounts/newaccount?form=submit&formname=createuser&digest=<digest> """ from zeta.config.environment import userscomp, vfcomp c.rclose = h.ZResp() # Calculate whether registration is allowed. regrbyinvite = h.str2bool( c.sysentries['regrbyinvite'] ) c.uinv = None if not regrbyinvite : c.allowregistration = True elif c.digest : c.uinv = userscomp.invbydigest( c.digest ) c.allowregistration = bool(c.uinv) else : c.uinv = None c.allowregistration = False # Setup context for page generation c.usernames = userscomp.usernames # Form handling def errhandler(ERROR_FLASH, errmsg) : h.flash( ERROR_FLASH + errmsg ) h.redirect_url( h.url_register ) vfcomp.process( request, c, defer=True, errhandler=h.hitchfn(errhandler, ERROR_FLASH), formnames=['createuser'] ) # If registeration was successful in `form handling` go-to-signin if c.form == 'submit' : username = request.POST.get( 'username', None ) c.uinv and userscomp.acceptedby( unicode(username), c.uinv ) h.flash( self.okmsg1 ) h.redirect_url( h.url_signin ) # Generate page c.rclose.append(render( '/derived/accounts/register.html' )) return c.rclose
def signin( self, environ ) : """User Signin. - Actual signing is handled by MultiGate middleware (using 401 status) - Authorization decorator should not be used here since this action will interact back-and-forth with authentication middleware. URLS : /accounts/signin """ if c.authusername == 'anonymous' : # This triggers the MultiGate middleware to display the sign in form abort(401) else : # Gotcha : somehow the messages are not getting cleared when it is # read from the template. So force clear all the flash messsages # for a fresh log-in. h.flash.pop_messages() h.redirect_url( h.url_sitehome )
def resetpass( self, environ ) : """Reset user password by validating emailid against `digest`, this controller / action will be invoked when user clicks the reset-link sent to his/her mail-id. URLS : /accounts/resetpass?form=request&formname=resetpass &digest=<digest>&emailid=<emailid> /accounts/resetpass?form=submit&formname=resetpass &emailid=<emailid> """ from zeta.config.environment import userscomp, vfcomp c.rclose = h.ZResp() # Form handling def errhandler(ERROR_FLASH, errmsg) : h.flash( ERROR_FLASH + errmsg ) h.redirect_url( h.url_sitehome ) vfcomp.process( request, c, defer=True, errhandler=h.hitchfn(errhandler, ERROR_FLASH), emailid=c.emailid, formnames=['resetpass'] ) if c.form == 'submit' : # Reset password completed h.flash( self.okmsg2 ) h.redirect_url( h.url_signin ) if c.emailid and c.digest : # Prompt user for new password user = userscomp.userbyemailid( unicode(c.emailid) ) refdigest = sha1( user.username + user.emailid + user.password ).hexdigest() c.allowreset = True # (refdigest == c.digest) # Generate page c.rclose.append( render( '/derived/accounts/resetpass.html' )) return c.rclose h.redirect_url( h.url_sitehome )
def integratevcs(self, environ, projectname): """Integrate / config / delete VCS entries URLS : /p/{projectname}/s/integratevcs?form=request&formname=integratevcs /p/{projectname}/s/integratevcs?form=submit&formname=integratevcs """ from zeta.config.environment import vfcomp, projcomp, vcscomp c.rclose = h.ZResp() # Handle forms def errhandler(errmsg): c.errmsg = errmsg vfcomp.process(request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=['Integratevcs'], user=c.authuser) # Setup context for page generation c.projsummary = c.project.summary c.vcs_typenames = vcscomp.vcstypenames c.title = 'IntegrateSource' # HTML page generation if c.errmsg: html = self.returnerrmsg(environ) elif c.form == 'submit': # Skip breadcrumbing, if it is a form submit c.title = '-Skip-' h.redirect_url(h.url_vcsintegrate) else: html = render('/derived/projects/vcsintegrate.html') c.rclose.append(html) return c.rclose
def milestone( self, environ, projectname, mstnid=None ) : """Individual milestone for project, `projectname` URLS : /p/<projectname>/m /p/<projectname>/m/<mstnid> """ from zeta.config.environment import projcomp, tckcomp h.redirect_url( h.url_projroadmap ) if not mstnid else None c.rclose = h.ZResp() # Setup context for page generation c.projsummary = c.project.summary c.milestone = projcomp.get_milestone( int(mstnid) ) m = c.milestone h.redirect_url( h.url_projroadmap ) if m and m.project_id != c.project.id else None c.tck_typenames = tckcomp.tcktypenames c.tck_statusnames = tckcomp.tckstatusnames c.tck_severitynames = tckcomp.tckseveritynames c.title = c.milestone.milestone_name c.chart13_data = [] bystatus, bytypes, byseverity, byowner, c.mstnresolved = \ h.chartify_mstn( c.mstntickets[m.id] ) c.chart13_data = [ m.id, map( fn, bytypes.iteritems() ), map( fn, byseverity.iteritems() ), map( fn, bystatus.iteritems() ), map( fn, byowner.iteritems() ), ] c.rclose.append(render( '/derived/projects/projmilestone.html' )) return c.rclose
def staticwiki(self, environ, swurl): """Static Wiki - every thing else URLS : /tos /aboutus /help/ /(swurl) /(swurl)?refresh=1 /(swurl)?textobj=swpreview&view=text /(swurl)?editsw=1&form=request&formname=editsw /(swurl)?form=submit&formname=editsw&view=js /(swurl)?form=submit&formname=delsw&delsw=1 """ from zeta.config.environment import vfcomp, syscomp, wikicomp c.rclose = h.ZResp() c.sweditable = h.authorized(h.HasPermname('STATICWIKI_CREATE')) # Form handling if self.formpermission(): c.errmsg = 'Do not have STATICWIKI_CREATE permission !!' def errhandler(errmsg): c.errmsg = errmsg kwargs = {'pathurl': swurl} if c.formname == 'delsw' else {} kwargs['user'] = c.authuser vfcomp.process(request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=['editsw', 'delsw'], **kwargs) if [c.form, c.formname] == ['submit', 'delsw'] and c.delsw: h.redirect_url(h.url_titleindex) # Setup context for page generation c.urldir = swurl and swurl[-1] == '/' c.swurl = swurl c.swiki = syscomp.get_staticwiki(swurl) c.title = c.swurl.split('/')[-1] html = '' if c.errmsg: html = self.returnerrmsg(environ) elif c.jsonobj and c.view == 'js': # Ajax request <JSON> html = self.handlejson(environ) elif c.textobj and c.view == 'text': # Ajax request <TEXT> html = self.handletext(environ) elif self._publicfile(c.swurl): # Check for public file html = '' elif c.view == 'js': # Ajax view, so empty html html = '' elif c.editsw and c.swiki: # Page-logic, edit static wiki c.wikitypenames = wikicomp.typenames c.title = '%s:edit' % c.title html = render('/derived/home/guestwiki.html') elif c.swiki and (c.swiki.type.wiki_typename == h.WIKITYPE_REDIRECT) \ and c.swiki.sourceurl : # Page redirect h.redirect_url(c.swiki.sourceurl) elif c.urldir: # List static wiki directory c.swikis = self.listswdir() c.swa = ca.get_analyticobj('staticwiki') c.swsnippets = getattr(c.swa, 'pagesnippets', {}) html = render('/derived/home/guestwiki.html') elif c.swiki: # Page-logic, show static wiki if not c.swiki.texthtml: c.swhtml = c.swiki.translate(wiki=c.swiki, cache=True) elif c.refresh: c.swhtml = c.swiki.translate(wiki=c.swiki, cache=True) else: c.swhtml = c.swiki.texthtml html = render('/derived/home/guestwiki.html') elif h.authorized(h.HasPermname('STATICWIKI_CREATE')): # Assume this as a new static wiki url and create it. c.wikitypenames = wikicomp.typenames c.swiki = syscomp.set_staticwiki(unicode(swurl), u'', byuser=c.authuser) c.editsw = 1 html = render('/derived/home/guestwiki.html') else: raise NotAuthorizedError( 'You are allowed to create this resource.') c.rclose.append(html) return c.rclose
def errhandler(ERROR_FLASH, errmsg) : h.flash( ERROR_FLASH + errmsg ) h.redirect_url( h.url_register )
def license(self, environ, licid): """Action for all license pages. URLS : /license/<licid> /license/<licid>?jsonobj=licattach&view=js /license/<licid>?jsonobj=lictag&view=js /license/<licid>?form=request&formname=updatelic /license/<licid>?form=submit&formname=updatelic&view=js /license/<licid>?form=submit&formname=rmlic /license/<licid>?form=submit&formname=addlicattachs&view=js /license/<licid>?form=submit&formname=dellicattachs&view=js /license/<licid>?form=submit&formname=addlictags&view=js /license/<licid>?form=submit&formname=dellictags&view=js """ from zeta.config.environment import liccomp, vfcomp c.rclose = h.ZResp() # Setting up urls to be stuffed into the page def errhandler(errmsg): c.errmsg = errmsg c.liceditable = h.authorized(h.HasPermname(['LICENSE_CREATE'])) c.att_editable = c.liceditable c.tag_editable = c.liceditable if c.form == 'submit' and c.liceditable: vfcomp.process(request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=[ 'updatelic', 'rmlic', 'addlictags', 'dellictags', 'addlicattachs', 'dellicattachs' ], licid=c.licid_i, user=c.authuser) else: c.errmsg = 'Need `LICENSE_CREATE` to access the page' # Setup context for page generation c.licprojects = c.licensetable = [] c.licensenames, c.licenselist, licfields = self._selectoptions() c.uplic = (c.form == 'request') and (c.formname == 'updatelic') if c.license and c.uplic: # Edit license c.title = '%s:edit' % c.license.licensename elif c.license: # License page lprjs = liccomp.licprojects(c.license.id) c.licprojects = [(p, self.url_forproject(p)) for p in lprjs[c.license.id] if p] c.attachs = self.modelattachments(c.license) c.tags = self.modeltags(c.license) c.title = c.license.licensename # Html page generation html = '' if c.view == 'js' and c.formname in ['addlicattachs']: html = IFRAME_RET elif c.view == 'js' and c.jsonobj and c.license: html = self.handlejson(environ) elif c.formname == 'rmlic' and c.licid: # when removing the displayed license, redirect to first license remaining = [ i for i, _, projects in licfields if licid_i != int(i) ] h.redirect_url(self.url_forlicense( remaining[0])) if remaining else h.redirec(h.url_crlic) elif (c.form == 'submit') and (c.formname == 'updatelic'): h.redirect_url(self.url_forlicense(licid)) elif c.view != 'js': html = render('/derived/license/license.html') c.rclose.append(html) return c.rclose
def errhandler(ERROR_FLASH, errmsg) : h.flash( ERROR_FLASH + errmsg ) h.redirect_url( h.url_sitehome )
def tickets( self, environ, username ) : """List tickets belonging to user (attributed as owner and/or promptuser URLS : /u/{username}/t /u/{username}/t?stdfilter=<name> /u/{username}/t?savfilter=<name> /u/{username}/t?form=submit&formname=addtckfilter&view=js /u/{username}/t?form=submit&formname=deltckfilter&view=js """ from zeta.config.environment import projcomp, tckcomp, vfcomp c.rclose = h.ZResp() # Setting up urls to be stuffed into the page kwargs = { 'username' : username } c.stdfilter and kwargs.update({ 'stdfilter' : c.stdfilter }) c.savfilter and kwargs.update({ 'savfilter' : c.savfilter }) h.url_ticketlist = self.url_usrtcks( **kwargs ) # Handle forms def errhandler(errmsg) : c.errmsg = errmsg if c.form in [ 'request', 'submit' ] and \ c.formname in [ 'addtckfilter', 'deltckfilter' ] and \ h.authorized( h.UserIn([ username ]) ) : vfcomp.process( request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=[ 'addtckfilter', 'deltckfilter' ], user=c.authuser ) # Setup context for both html page and AJAX request. c.tckfilters = h.compile_tckfilters( tckfilters ) c.title = '%s:tickets' % c.authuser.username # HTML page generation if c.jsonobj and c.view == 'js' : html = self.handlejson(environ) elif c.view != 'js' and not (c.stdfilter or c.savfilter) and c.tckfilters : kw = { 'username' : username, 'stdfilter' : c.tckfilters[0][0] } h.redirect_url( self.url_usrtcks( **kw )) elif c.view != 'js' : # Setup context for html page c.tckeditable = False c.tckccodes = h.tckccodes c.tstat_resolv = h.parse_csv( c.sysentries.get( u'ticketresolv', '' )) c.tck_typenames = tckcomp.tcktypenames c.tck_statusnames = tckcomp.tckstatusnames c.tck_severitynames = tckcomp.tckseveritynames c.projectnames = projcomp.projectnames userfilters = tckcomp.get_ticketfilter( user=c.authuser ) fn = lambda tf : ( tf.id, [ tf.name, tf.filterbyjson ] ) c.savfilterlist = dict( map( fn, userfilters )) c.savfilterval = c.savfilterlist.get( c.savfilter, ['', ''] ) c.savfiltername = c.savfilterval[0] fn = lambda k, v = [ self.url_usrtcks(**{'username' : username, 'savfilter' : k }) v[0] ] c.savfilterlist = map( fn, c.savfilterlist.iteritems() ) html = render( '/derived/userpage/ticket.html' ) else : html ='' c.rclose.append(html) return c.rclose
def createticket(self, environ, projectname): """Create ticket URLS : /p/{projectname}/t/createticket?form=request&formname=createtck /p/{projectname}/t/createticket?form=submit&formname=createtck """ from zeta.config.environment import vfcomp, projcomp, tckcomp c.rclose = h.ZResp() # Handle forms def errhandler(errmsg): c.errmsg = errmsg vfcomp.process(request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=['createtck'], user=c.authuser) # Setup context for page generation c.project = c.project or projcomp.get_project(projectname) c.projectname = c.project.projectname c.projsummary = c.project.summary # HTML page generation if c.errmsg: html = self.returnerrmsg(environ) elif c.form == 'submit': h.flash(MESSAGE_FLASH + 'Created ticket ...') # Ticket creation, redirect after submit c.title = '-Skip-' h.redirect_url(h.url_ticketcreate) else: # Setup context for page generation c.seltickets = self._seltickets() c.tck_typenames = tckcomp.tcktypenames c.tck_statusnames = tckcomp.tckstatusnames c.tck_severitynames = tckcomp.tckseveritynames c.pcomponents, c.pmilestones, c.pversions, c.projusers = \ tckcomp.projdetails( c.project ) c.projusers = list(set(c.projusers + [c.project.admin.username])) c.pmilestones = [m[:2] for m in c.pmilestones if not any(m[2:])] c.mstnnames = sorted([m[0] for m in c.pmilestones]) c.pcompnames = sorted([comp[0] for comp in c.pcomponents]) c.vernames = sorted([ver[0] for ver in c.pversions]) c.pcomponents = [(tup[1], tup[0]) for tup in c.pcomponents] c.pmilestones = [(tup[1], tup[0]) for tup in c.pmilestones] c.pversions = [(tup[1], tup[0]) for tup in c.pversions] c.title = 'CreateTicket' c.tckeditable = h.authorized(h.HasPermname('TICKET_CREATE')) html = render('/derived/projects/ticketcreate.html') h.flash.pop_messages( ) # Clear flashmessage if any ! after page generation c.rclose.append(html) return c.rclose
def ticketindex(self, environ, projectname): """Project tickets URLS : /p/{projectname}/t /p/{projectname}/t?stdfilter=<stdfilter>&savfilter=<savfilter> /p/{projectname}/t?jsonobj=ticketlist&view=js /p/{projectname}/t?form=submit&formname=configtck&view=js /p/{projectname}/t?form=submit&formname=configtstat&view=js /p/{projectname}/t?form=submit&formname=addtckfilter&view=js /p/{projectname}/t?form=submit&formname=deltckfilter&view=js """ from zeta.config.environment import vfcomp, projcomp, tckcomp c.rclose = h.ZResp() # Handle forms def errhandler(errmsg): c.errmsg = errmsg if self.formpermission(): c.errmsg = 'Do not have %s permission !!' % tckperm[c.formname] else: vfcomp.process(request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=[ 'configtck', 'configtstat', 'addtckfilter', 'deltckfilter' ], user=c.authuser) # Setup context for both html page and AJAX request. c.projsummary = c.project.summary c.tckfilters = h.compile_tckfilters(tckfilters) c.title = '-Skip-' # HTML page generation if c.errmsg: html = self.returnerrmsg(environ) elif c.view == 'js' and c.jsonobj: html = self.handlejson(environ) elif c.view != 'js' and not (c.stdfilter or c.savfilter) and c.tckfilters: url = self.url_tcklist(projectname, stdfilter=c.tckfilters[0][0]) h.redirect_url(url) elif c.view != 'js': # Setup context for html page c.tck_typenames = tckcomp.tcktypenames c.tck_statusnames = tckcomp.tckstatusnames c.tck_severitynames = tckcomp.tckseveritynames c.seltickets = self._seltickets() c.pcomponents, c.pmilestones, c.pversions, c.projusers = \ tckcomp.projdetails( c.project ) c.projusers = self.projusers(c.project) c.pmilestones = [m[:2] for m in c.pmilestones if not any(m[2:])] c.mstnnames = sorted([m[0] for m in c.pmilestones]) c.pcompnames = sorted([comp[0] for comp in c.pcomponents]) c.vernames = sorted([ver[0] for ver in c.pversions]) c.tckeditable = h.authorized(h.HasPermname('TICKET_CREATE')) c.tckccodes = h.tckccodes c.tstat_resolv = h.parse_csv(c.sysentries.get(u'ticketresolv', '')) userfilters = tckcomp.get_ticketfilter(user=c.authuser) fn = lambda tf: (tf.id, [tf.name, tf.filterbyjson]) c.savfilterlist = dict(map(fn, userfilters)) c.savfilterval = c.savfilterlist.get(c.savfilter, ['', '']) c.savfiltername = c.savfilterval[0] fn = lambda k, v: [ self.url_tcklist(c.projectname, savfilter=k), v[0] ] c.savfilterlist = map(fn, c.savfilterlist.iteritems()) c.title = 'Ticket:list' html = render('/derived/projects/ticketindex.html') c.rclose.append(html) return c.rclose
def mounts(self, environ, projectname): """List of Repository mount points URLS : /p/<projectname>/mnt /p/<projectname>/mnt?name=<name> /p/<projectname>/mnt?changeid=<mountid> /p/<projectname>/mnt?jsonobj=mountlist&view=js /p/<projectname>/mnt?form=submit&formname=createmount /p/<projectname>/mnt?form=submit&formname=updatemount /p/<projectname>/mnt?form=submit&formname=deletemount /p/<projectname>/mnt?form=submit&formname=createmount&view=js /p/<projectname>/mnt?form=submit&formname=deletemount&view=js """ from zeta.config.environment import vfcomp, projcomp, vcscomp c.rclose = h.ZResp() # Form handling def errhandler(errmsg): c.errmsg = errmsg if self.formpermission(): c.errmsg = 'Do not have %s permission !!' % mountperm[c.formname] else: vfcomp.process( request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=['createmount', 'updatemount', 'deletemount']) # Setup context for page generation c.projsummary = c.project.summary c.mnt = vcscomp.get_mount(int(c.changeid), attrload=['vcs']) if c.changeid else None c.title = '-Skip-' if c.form else '%s:mounts' % projectname # HTML page generation if c.errmsg: html = self.returnerrmsg(environ) elif c.form == 'submit' and (c.view != 'js') and \ c.formname in [ 'createmount', 'updatemount' ]: h.redirect_url(h.url_projmounts) elif c.view == 'js' and c.jsonobj: html = self.handlejson(environ) elif c.form and c.view == 'js': html = '' else: c.contents = vcscomp.mountcontents c.vcslist = [(v.id, v.name) for v in c.project.vcslist] c.pmounts = [ list(vals[:3]) + [h.fix2repospath(vals[3], [vals[7]]).lstrip('/')] + list(vals[4:]) for vals in vcscomp.projmounts(c.project) ] html = render('/derived/projects/projmounts.html') c.rclose.append(html) return c.rclose
def wiki(self, environ, projectname, wurl=None): """Project wiki pages. URLS : /p/{projectname}/wiki/*(wurl) /p/{projectname}/wiki/*(wurl)?ver=<num> /p/{projectname}/wiki/*(wurl)?wikiedit=1 /p/{projectname}/wiki/*(wurl)?wikitalkpage=1 /p/{projectname}/wiki/*(wurl)?wikihistory=1 /p/{projectname}/wiki/*(wurl)?wikidiff=1 /p/{projectname}/wiki/*(wurl)?translate=1 /p/{projectname}/wiki/*(wurl)?downloadas=text /p/{projectname}/wiki/*(wurl)?downloadas=ps /p/{projectname}/wiki/*(wurl)?downloadas=pdf /p/{projectname}/wiki/*(wurl)?jsonobj=wikicomments&view=js /p/{projectname}/wiki/*(wurl)?jsonobj=wikircomments&view=js /p/{projectname}/wiki/*(wurl)?jsonobj=wikiattach&view=js /p/{projectname}/wiki/*(wurl)?jsonobj=wikitag&view=js /p/{projectname}/wiki/*(wurl)?textobj=wikipreview&view=text /p/{projectname}/wiki/*(wurl)?form=submit&formname=addwikiattachs&view=js /p/{projectname}/wiki/*(wurl)?form=submit&formname=delwikiattachs&view=js /p/{projectname}/wiki/*(wurl)?form=submit&formname=addwikitags&view=js /p/{projectname}/wiki/*(wurl)?form=submit&formname=delwikitags&view=js /p/{projectname}/wiki/*(wurl)?form=submit&formname=wikicont&view=js /p/{projectname}/wiki/*(wurl)?form=submit&formname=createwcmt&view=js /p/{projectname}/wiki/*(wurl)?form=submit&formname=updatewcmt&view=js /p/{projectname}/wiki/*(wurl)?form=submit&formname=replywcmt&view=js /p/{projectname}/wiki/*(wurl)?wikidiff=1&form=submit&formname=wikidiff /p/{projectname}/wiki/*(wurl)?form=submit&formname=wikifav&view=js /p/{projectname}/wiki/*(wurl)?form=submit&formname=votewiki&view=js """ from zeta.config.environment import projcomp, wikicomp, votcomp, vfcomp version = request.params.get('ver', None) wurl = wurl.rstrip('/') c.rclose = h.ZResp() # Handle forms def errhandler(errmsg): c.errmsg = errmsg if self.formpermission(): c.errmsg = 'Do not have %s permission !!' % tckperm[c.formname] else: vfcomp.process(request, c, defer=True, errhandler=h.hitchfn(errhandler), formnames=[ 'addwikiattachs', 'delwikiattachs', 'addwikitags', 'delwikitags', 'wikicont', 'createwcmt', 'updatewcmt', 'replywcmt', 'wikidiff', 'wikifav', 'votewiki' ], user=c.authuser) # Setup context for page generation c.projsummary = c.project.summary if not c.jsonobj: c.wikipagenames = self.wikipagename(wikicomp.wikiurls(c.project)) c.wikipagename = wurl c.wikieditable = h.authorized(h.HasPermname('WIKI_CREATE')) c.wiki = c.wiki or wikicomp.get_wiki(unicode(c.pathinfo)) # If there is no wiki page by that name then create the wiki and # show the edit page. if not c.wiki and c.wikieditable: c.wiki = wikicomp.create_wiki(unicode(c.pathinfo), wtype=c.sysentries.get( 'def_wikitype', None), creator=c.authusername) c.project and wikicomp.config_wiki(c.wiki, project=c.project) c.wikiedit = '1' elif not c.wiki: raise NotAuthorizedError( 'Do not have permission to create wiki page, WIKI_CREATE') # If the wiki page is empty (ie) no wiki content ever created, then # show the edit page. if not c.wiki.latest_version and c.wikieditable: h.flash(MESSAGE_FLASH + 'Empty page, write some text ...') c.wikiedit = '1' elif not c.wiki.latest_version: raise NotAuthorizedError( 'Do not have permission to create wiki page, WIKI_CREATE') if c.wiki: c.isuserfavorite = wikicomp.isfavorite(c.authuser.id, c.wiki.id) c.title = wurl # HTML page generation html = '' typename = c.wiki.type.wiki_typename if c.errmsg: html = self.returnerrmsg(environ) if c.view == 'js' and c.formname in ['addwikiattachs']: html = IFRAME_RET elif c.view == 'js' and c.jsonobj: html = self.handlejson(environ) elif c.view == 'text' and c.textobj: html = self.handletext(environ) elif typename == h.WIKITYPE_REDIRECT and c.wiki.sourceurl: # Page redirect h.redirect_url(c.wiki.sourceurl) elif c.wikiedit: c.wcnt = wikicomp.get_content(c.wiki) c.wikitypenames = wikicomp.typenames c.title += ':edit' html = render('/derived/projects/wiki.html') elif c.wtalkpage: c.items_wikicomments = self._json_wikicomments() c.title += ':talkpage' html = render('/derived/projects/wiki.html') elif c.whistory: c.wikicontents = wikicomp.get_content(c.wiki, all=True) c.title += ':history' html = render('/derived/projects/wiki.html') elif c.wikidiff: v = c.oldver or 1 c.wcnt_oldver = wikicomp.get_content(c.wiki, version=v) c.wcnt_newver = wikicomp.get_content(c.wiki, version=c.newver) c.oldver = c.wcnt_oldver.id c.newver = c.wcnt_newver.id c.title += ':diff' html = render('/derived/projects/wiki.html') elif c.downloadas: c.wcnt = wikicomp.get_content(c.wiki) wikihtml = c.wcnt.translate( wiki=c.wiki, cache=True) if not c.wcnt.texthtml else c.wcnt.texthtml fmtobj = h.Html2Doc(wikihtml, format=c.downloadas) c.title = '-Skip-' html = fmtobj.convert() response.headers['Content-disposition'] = \ str( 'attachment; filename="%s.%s"' % (c.wiki.wikiurl, c.downloadas) ) elif c.view != 'js': # Refetch the wiki entry from DB with prepared query c.attachs = self._wikiattachs(c.wiki) c.tags = self._wikitags(c.wiki) c.att_editable = c.tag_editable = c.wikieditable c.wcnts = wikicomp.get_content(c.wiki, all=True) c.wikiauthors = h.computecount(c.wcnts, lambda x: x.author) c.wcnt = (version and c.wcnts[int(version) - 1] or c.wcnts[-1]) if c.wcnts else None c.wikitypenames = wikicomp.typenames c.wikihtml = '' if c.wcnt: if not c.wcnt.texthtml: c.wikihtml = c.wcnt.translate(wiki=c.wiki, cache=True) elif c.translate: c.wikihtml = c.wcnt.translate(wiki=c.wiki, cache=True) else: c.wikihtml = c.wcnt.texthtml lastver = c.wiki.latest_version fn = lambda v: [ self.url_wikiurl(projectname, wurl, ver=str(v)), str(v) ] c.wversions = map(fn, range(1, lastver + 1)) c.wdownload = [ [h.url_wikidownastext, 'as text'], [h.url_wikidownasps, 'as post-script'], [h.url_wikidownaspdf, 'as pdf'], ] uservote = votcomp.get_wikivote(c.authuser, c.wiki) votes = wikicomp.countvotes(votes=c.wiki.votes) c.upvotes = votes.get('up', 0) c.downvotes = votes.get('down', 0) c.currvote = uservote and uservote.votedas or '' h.url_reviewwiki = self.url_wikireview(projectname, c.wiki.wikiurl, c.wcnt.id) html = render('/derived/projects/wiki.html') c.rclose.append(html) return c.rclose