def charts(self, environ): """License analytics chart URLS : /license/charts /license/charts?chartname=<name> """ from zeta.config.environment import liccomp c.rclose = h.ZResp() c.chartname = c.chartname or 'chart6' c.selectedchart = (c.chartname, self._charts[c.chartname]) c.chartoptions = [(self.url_licchart(name), text) for name, text in self._charts.iteritems()] c.la = ca.get_analyticobj('license') c.ta = ca.get_analyticobj('tags') if c.chartname == 'chart6': # Projects Vs license c.chart6_data = getattr(c.la, 'chart6_data', []) elif c.chartname == 'chart7': # Tagged license c.chart7_data = getattr(c.ta, 'chart7_data', []) c.chart7_tags = getattr(c.ta, 'chart7_tags', []) c.title = 'License:Charts' # Html page generation c.rclose.append(render('/derived/license/charts.html')) return c.rclose
def test_3_staticwiki(self): """Testing SWiki analytics""" import lxml.html as lh log.info("Testing SWiki analytics") swa = ca.get_analyticobj('staticwiki') swa.analyse() swa.cacheme() swa = ca.get_analyticobj('staticwiki') # pagesnippets ref = [] for (swid, (hd, pr)) in swa.pagesnippets.items(): sw = syscomp.get_staticwiki(swid) root = sw.texthtml and lh.fromstring(sw.texthtml) heads = root.xpath("//h1") or root.xpath("//h2") or \ root.xpath("//h3") or root.xpath("//h4") or root.xpath("//h5") ref_head = heads and ''.join( heads.pop(0).xpath(".//text()")) or u'' ref_para = ''.join(root.xpath("//p/text()")) assert_true(hd == ref_head, 'Mismatch in head snippet from static wiki') assert_true(pr == ref_para, 'Mismatch in para snippet from static wiki')
def test_6_projects(self): """Testing Project analytics""" log.info("Testing Project analytics") pa = ca.get_analyticobj('projects') pa.analyse() pa.cacheme() pa = ca.get_analyticobj('projects')
def test_9_wiki(self): """Testing Wiki analytics""" log.info("Testing Wiki analytics") wa = ca.get_analyticobj('wiki') wa.analyse() wa.cacheme() wa = ca.get_analyticobj('wiki')
def test_8_reviews(self): """Testing Review analytics""" log.info("Testing Review analytics") ra = ca.get_analyticobj('reviews') ra.analyse() ra.cacheme() ra = ca.get_analyticobj('reviews')
def test_7_tickets(self): """Testing Ticket analytics""" log.info("Testing Ticket analytics") ta = ca.get_analyticobj('tickets') ta.analyse() ta.cacheme() ta = ca.get_analyticobj('tickets') projects = dict([(p.id, p) for p in projcomp.get_project(attrload=['tickets'])]) # chart21_data for p, v in ta.chart21_data.iteritems(): p = projects[p] ref = len(p.tickets) assert_equal(ref, sum([x[1] for x in v[0]]), 'mismatch in chart21_data') assert_equal(ref, sum([x[1] for x in v[1]]), 'mismatch in chart21_data') assert_equal(ref, sum([x[1] for x in v[2]]), 'mismatch in chart21_data') # chart22_data for p, v in ta.chart22_data.iteritems(): p = projects[p] assert_equal( set([ x[0] for x in v ]).difference(projcomp.projusernames(p) + [p.admin.username]), set([]), 'mismatch in chart22_data') # chart23_data for p, v in ta.chart23_data.iteritems(): p = projects[p] assert_equal( set([x[0] for x in v]).difference( [comp.componentname for comp in p.components]), set([]), 'mismatch in chart23_data') # chart24_data for p, v in ta.chart24_data.iteritems(): p = projects[p] assert_equal( set([x[0] for x in v ]).difference([m.milestone_name for m in p.milestones]), set([]), 'mismatch in chart24_data') # chart25_data for p, v in ta.chart25_data.iteritems(): p = projects[p] assert_equal( set([x[0] for x in v ]).difference([v.version_name for v in p.versions]), set([]), 'mismatch in chart25_data')
def test_4_users(self): """Testing User analytics""" log.info("Testing User analytics") ua = ca.get_analyticobj('users') ua.analyse() ua.cacheme() ua = ca.get_analyticobj('users') users = userscomp.get_user( attrload=['logs', 'permgroups', 'adminprojects', 'owncomponents']) # chart8_data ref = sorted([[u.id, u.username, len(u.logs)] for u in users], key=lambda u: u[0]) data = sorted(ua.chart8_data, key=lambda u: u[0]) # chart9_data pnames = userscomp.site_permnames ref = [] for u in users: if u.username == 'admin': upnames = pnames else: upnames = [ pn.perm_name for pg in u.permgroups for pn in pg.perm_names ] ref.append([ u.id, u.username, list(set(pnames).intersection(upnames)), list(set(pnames).difference(upnames)) ]) assert_equal(sorted(ref, key=lambda u: u[0]), sorted(ua.chart9_data, key=lambda u: u[0]), 'Mismatch in chart9_data') # chart10_data ref = [[ u.id, u.username, sorted([p.projectname for p in u.adminprojects]) ] for u in users] ref = filter(lambda x: x[2], ref) assert_equal(sorted(ref, key=lambda x: x[0]), sorted(ua.chart10_data, key=lambda x: x[0]), 'mismatch in chart10_data') # chart11_data ref = [[ u.id, u.username, sorted([comp.componentname for comp in u.owncomponents]) ] for u in users] ref = filter(lambda x: x[2], ref) assert_equal(sorted(ref, key=lambda x: x[0]), sorted(ua.chart11_data, key=lambda x: x[0]), 'mismatch in chart11_data')
def charts(self, environ, projectname): """Charts and analytics for project wiki URLS : /p/{projectname}/wiki/charts /p/{projectname}/wiki/charts?chartname=<name> """ from zeta.config.environment import wikicomp c.rclose = h.ZResp() # Setup context for page generation c.projsummary = c.project.summary c.selectedchart = (c.chartname, self._charts[c.chartname]) c.chartoptions = [(self.url_wikichart(projectname, name), text) for name, text in self._charts.iteritems()] c.ta = ca.get_analyticobj('tags') c.wa = ca.get_analyticobj('wiki') if c.chartname == 'chart16': # Wiki comments and versions c.chart16_data = getattr(c.wa, 'chart16_data', {}).get(c.project.id, []) c.chart16_wiki = getattr(c.wa, 'chart16_wiki', {}).get(c.project.id, []) elif c.chartname == 'chart17': # Wiki votes c.chart17_data = getattr(c.wa, 'chart17_data', {}).get(c.project.id, []) elif c.chartname == 'chart18': # Wiki authors c.chart18_data = getattr(c.wa, 'chart18_data', {}).get(c.project.id, []) c.chart18_usrs = getattr(c.wa, 'chart18_usrs', {}).get(c.project.id, []) elif c.chartname == 'chart19': # Wiki commentors c.chart19_data = getattr(c.wa, 'chart19_data', {}).get(c.project.id, []) c.chart19_usrs = getattr(c.wa, 'chart19_usrs', {}).get(c.project.id, []) elif c.chartname == 'chart20': # Tagged wiki pages c.chart20_data = getattr(c.ta, 'chart20_data', {}).get(c.project.id, []) c.chart20_tags = getattr( c.ta, 'chart20_tags', {}, ).get(c.project.id, []) c.title = 'WikiCharts' c.rclose.append(render('/derived/projects/wikicharts.html')) return c.rclose
def test_5_license(self): """Testing License analytics""" log.info("Testing License analytics") la = ca.get_analyticobj('license') la.analyse() la.cacheme() la = ca.get_analyticobj('license') # chart6_data ref = [[l.id, l.licensename, [p.projectname for p in l.projects]] for l in liccomp.get_license(attrload=['projects'])] assert_equal(sorted(ref, key=lambda l: l[0]), sorted(la.chart6_data, key=lambda l: l[0]), 'mismatch in chart6_data')
def usercharts( self, environ, username='' ) : """User charts URLS : /u/{username}/charts /u/{username}/charts?chartname=<name> """ from zeta.config.environment import userscomp c.rclose = h.ZResp() # Setup context for page rendering c.chartname = c.chartname or 'chart12' c.selectedchart = (c.chartname, self._usercharts[c.chartname]) c.chartoptions = [ (self.url_userschart(name), text) for name, text in self._usercharts.iteritems() ] c.user = userscomp.get_user( unicode(username) ) c.ua = ca.get_analyticobj( 'users' ) data = getattr( c.ua, 'chart12_data', {} ).get( c.user.id, [ c.user.id, c.user.username, [] ] ) c.chart12_data = data c.title = '%s:Charts' % username # Html page generation c.rclose.append(render( '/derived/userpage/usercharts.html' )) return c.rclose
def tagname( self, environ, tgnm ) : """Show tag details""" from zeta.config.environment import tagcomp, projcomp c.rclose = h.ZResp() # Setup context for page generation c.tag = tagcomp.get_tag( tgnm, attrload=[ 'attachments', 'licenses', 'projects', 'tickets', 'reviews', 'wikipages' ], attrload_all=[ 'tickets.project', 'reviews.project', 'wikipages.project' ] ) c.projecturls = self.projecturls( projcomp.projectnames ) # Pie Chart for tagged resource type ta = ca.get_analyticobj( 'tags' ) c.chart1_rtags= getattr( ta, 'chart1_rtags', {} ).get( tgnm, [] ) c.chart1_data = getattr( ta, 'chart1_data', {} ).get( tgnm, [] ) c.title = tgnm # Html page generation c.rclose.append(render( '/derived/tag/tag.html' )) return c.rclose
def charts( self, environ ) : """Charts for combined users URLS : /u/charts /u/charts?chartname=<name> """ from zeta.config.environment import userscomp c.rclose = h.ZResp() # Setup context for page rendering c.chartname = c.chartname or 'chart8' c.selectedchart = (c.chartname, self._userscharts[c.chartname]) c.chartoptions = [ (self.url_userschart(name), text) for name, text in self._userscharts.iteritems() ] c.ua = ca.get_analyticobj( 'users' ) if c.chartname == 'chart8' : # User activity c.chart8_data = getattr( c.ua, 'chart8_data', [] ) elif c.chartname == 'chart9' : # User site-permission c.chart9_data = getattr( c.ua, 'chart9_data', [] ) elif c.chartname == 'chart10' : # project administrators c.chart10_data = getattr( c.ua, 'chart10_data', [] ) elif c.chartname == 'chart11' : # Component owners c.chart11_data = getattr( c.ua, 'chart11_data', [] ) c.chart11_ccnt = getattr( c.ua, 'chart11_ccnt', [] ) c.title = 'Users:Charts' # Html page generation c.rclose.append(render( '/derived/userpage/userscharts.html' )) return c.rclose
def charts(self, environ, projectname): """Charts and analytics for project tickets URLS : /p/{projectname}/r/charts """ c.rclose = h.ZResp() # Setup context for html page c.projsummary = c.project.summary c.chartname = c.chartname or 'chart27' c.selectedchart = (c.chartname, self._charts[c.chartname]) fn = lambda n, t: (self.url_revwchart(projectname, n), t) c.chartoptions = map(fn, self._charts.iteritems()) c.ra = ca.get_analyticobj('reviews') if c.chartname == 'chart27': # Pie chart of reviewers c.chart27_data = getattr(c.ra, 'chart27_data', {}).get(c.project.id, []) c.chart27_usrs = getattr(c.ra, 'chart27_usrs', {}).get(c.project.id, []) c.title = 'ReviewCharts' c.rclose.append(render('/derived/projects/reviewcharts.html')) return c.rclose
def charts( self, environ, projectname ) : """Chart analytics for project `projectname` URLS : /p/<projectname>/charts /p/<projectname>/charts?chartname=<name> """ c.rclose = h.ZResp() # Setup context for page rendering c.projectname = c.project.projectname c.projsummary = c.project.summary c.chartname = c.chartname or 'chart14' c.selectedchart = (c.chartname, self._charts[c.chartname]) c.chartoptions = [ ( self.url_projchart( projectname, name), text ) for name, text in self._charts.iteritems() ] c.pa = ca.get_analyticobj( 'projects' ) c.title = '%s:Charts' % projectname # Html page generation if c.chartname == 'chart14' : c.chart14_data = getattr( c.pa, 'chart14_data', {} ).get( projectname, {} ).items() elif c.chartname == 'chart15' : dates = [] mstns = [] for m in c.project.milestones : created_on = timezone('UTC').localize(m.created_on) dates.extend([ created_on, m.due_date ]) mstns.append(( m, created_on, m.due_date )) mstns = sorted( mstns, key=lambda x: x[1] ) dates = sorted(filter( None, dates )) c.chart15_data = [] for mstn in mstns : m = mstn[0] mrange = mstn[1:3] # stacked bar : open, cancelled, completed if not mrange[1] : days = (dates[-1]-mrange[0]).days elif mrange[1] > mrange[0] : days = (mrange[1]-mrange[0]).days elif mrange[1] <= mrange[0] : days = 0 bar = [ (mrange[0]-dates[0]).days ] if m.completed : bar.extend( [0, 0, days] ) elif m.cancelled : bar.extend( [0, days, 0] ) else : bar.extend( [days, 0, 0] ) c.chart15_data.append( [m.milestone_name] + bar ) date = dates and dates[0] or None c.chart15_frmdt = h.date2jsdate( date, [ '2000', '0', '1' ] ) c.rclose.append(render( '/derived/projects/projcharts.html' )) return c.rclose
def test_2_attach(self): """Testing Attachment analytics""" log.info("Testing Attachment analytics") aa = ca.get_analyticobj('attachs') aa.analyse() aa.cacheme() aa = ca.get_analyticobj('attachs') # chart2_data ref = [] for u in userscomp.get_user(attrload=['uploadedattachments']): if not u.uploadedattachments: continue atts = len(u.uploadedattachments) pyld = sum([ a and len(attachcomp.content(a)) or 0 for a in u.uploadedattachments ]) ref.append([u.username, atts, pyld]) assert_equal(sorted(ref, key=lambda x: x[0]), sorted(aa.chart2_data, key=lambda x: x[0]), 'mismatch in chart2_data') # chart2_fcnt attachs = attachcomp.get_attach() assert_equal(len(attachs), aa.chart2_fcnt, 'Mismatch in chart2_fcnt') # chart2_payld ref = sum([len(attachcomp.content(a)) for a in attachs if a]) assert_equal(ref, aa.chart2_payld, 'Mismatch in chart2_payld') # chart3_data ref = sorted([[a.id, a.filename, a.download_count] for a in attachs], key=lambda x: x[0]) data = sorted(aa.chart3_data, key=lambda x: x[0]) assert_equal(ref, data, 'mismatch in chart3_data') # chart5_data data = [] [data.extend(v) for v in aa.chart5_data] ref = [[a.id, a.filename, a.created_on.ctime(), a.created_on] for a in sorted(attachs, key=lambda a: a.created_on)] assert_equal(ref, data, 'Mismatch in chart5_data')
def index( self, environ ) : """List of all attachments URLS : /attachment /attachment?fromid=<number> /attachment?all=1 /attachment?form=submit&formname=attachssummary&view=js /attachment?form=submit&formname=attachstags&view=js """ from zeta.config.environment import attcomp, vfcomp c.rclose = h.ZResp() h.url_attachpages = self.url_attachpages() # Form handling def errhandler( errmsg ) : c.errmsg = errmsg vfcomp.process( request, c, defer=True, errhandler=errhandler, user=c.authuser, formnames=['attachssummary', 'attachstags'] ) try : fromid = c.fromid and int(c.fromid) fromid -= 1 except : fromid = None c.title = 'Attachments' c.aa = ca.get_analyticobj( 'attachs' ) c.ua = ca.get_analyticobj( 'users' ) c.la = ca.get_analyticobj( 'license' ) c.pa = ca.get_analyticobj( 'projects' ) c.ta = ca.get_analyticobj( 'tickets' ) c.ra = ca.get_analyticobj( 'reviews' ) c.wa = ca.get_analyticobj( 'wiki' ) # Html page generation if c.errmsg : html = self.returnerrmsg(environ) elif c.view == 'js' : html = '' else : limit = 100 if c.all == None else None attachments = attcomp.attachments( offset=fromid, limit=limit ) attachs = [ [ aid ] + attachments[aid][:-1] + \ [ ', '.join(attachments[aid][-1]) ] + \ [ self.url_attachdownl( aid ) ] for aid in attachments ] c.attachassc= attcomp.attachassc() c.attachments = { 'all-attachments' : attachs } c.editable = h.authorized( h.ValidUser( strict='True' )) html = render( '/derived/attachs/index.html' ) c.rclose.append( html ) return c.rclose
def charts( self, environ ) : """Attachment charts URLS : /attachment/charts /attachment/charts?chartname=<name> """ # Setup context for page generation c.rclose = h.ZResp() c.chartname = c.chartname or 'chart2' c.selectedchart = ( c.chartname, self._charts[c.chartname] ) c.chartoptions = [ ( h.url_attachcharts( name ), text ) for name, text in self._charts.iteritems() ] c.ta = ca.get_analyticobj( 'tags' ) c.aa = ca.get_analyticobj( 'attachs' ) if c.chartname == 'chart2' : # user Vs attachments c.chart2_data = getattr( c.aa, 'chart2_data', [] ) c.chart2_fcnt = getattr( c.aa, 'chart2_fcnt', 0 ) c.chart2_payld= getattr( c.aa, 'chart2_payld', 0 ) elif c.chartname == 'chart3' : # attachment Vs download c.chart3_data = getattr( c.aa, 'chart3_data', [] ) elif c.chartname == 'chart4' : # attachment Vs tags c.chart4_data = getattr( c.ta, 'chart4_data', [] ) c.chart4_tags = getattr( c.ta, 'chart4_tags', [] ) elif c.chartname == 'chart5' : # attachment Vs uploaded time c.chart5_data = getattr( c.aa, 'chart5_data', [] ) date = c.chart5_data and c.chart5_data[0][0][3] or None c.chart5_frmdt= h.date2jsdate( date, [ '2000', '0', '1' ] ) c.chart5_data = [ [ l[:3] for l in logs ] for logs in c.chart5_data ] c.title = "Attachment:Charts" # Html page generation c.rclose.append(render( '/derived/attachs/charts.html' )) return c.rclose
def titleindex(self, environ): """Static Wiki - titleindex URLS : /titleindex /TitleIndex """ from zeta.config.environment import syscomp c.rclose = h.ZResp() c.sweditable = h.authorized(h.HasPermname('STATICWIKI_CREATE')) c.swikis = [(sw.id, sw.path, self.url_editsw(sw.path), self.suburl_delsw(sw.path)) for sw in syscomp.get_staticwiki()] c.swikis = sorted(c.swikis, key=lambda sw: sw[1]) c.swa = ca.get_analyticobj('staticwiki') c.swsnippets = getattr(c.swa, 'pagesnippets', {}) c.title = 'TitleIndex' c.rclose.append(render('/derived/home/titleindex.html')) return c.rclose
def titleindex(self, environ, projectname): """Title index of all Project wiki pages. URLS : /p/{projectname}/wiki/titleindex /p/{projectname}/wiki/TitleIndex """ from zeta.config.environment import projcomp, wikicomp c.rclose = h.ZResp() # Setup context for page generation c.projsummary = c.project.summary wikiurls = wikicomp.wikiurls(c.project) c.wikipagenames = self.wikipagename(wikiurls) fn = lambda wu: (wu[0], h.wiki_parseurl(wu[1])) c.titlepages = sorted(map(fn, wikiurls), key=lambda x: x[1]) c.wikipagename = None c.wa = ca.get_analyticobj('wiki') c.wsnippets = getattr(c.wa, 'pagesnippets', {}).get(c.project.id, {}) c.title = '%s:titleindex' % projectname # HTML page generation c.rclose.append(render('/derived/projects/wikitindex.html')) return c.rclose
def charts(self, environ, projectname): """Charts and analytics for project tickets URLS : /p/{projectname}/t/charts /p/{projectname}/t/charts?chartname=<name> """ c.rclose = h.ZResp() # Setup context for page generation c.projsummary = c.project.summary c.chartname = c.chartname or 'chart21' c.selectedchart = (c.chartname, self._charts[c.chartname]) fn = lambda n, t: (self.url_tckchart(projectname, n), t) c.chartoptions = map(fn, self._charts.iteritems()) c.tcka = ca.get_analyticobj('tickets') if c.chartname == 'chart21': # Pie chart for types, severity and status c.chart21_data = getattr(c.tcka, 'chart21_data', {}).get(c.project.id, []) elif c.chartname == 'chart22': # Pie chart of types, severity and status for project users allusers = getattr(c.tcka, 'chart22_data', {}).get(c.project.id, []) c.chart22_usrs = getattr(c.tcka, 'chart22_usrs', {}).get(c.project.id, []) p = c.projectname fn = lambda u: (self.url_tckchart(p, 'chart22', owner=u[0]), u[0]) c.ticketowners = map(fn, c.chart22_usrs) c.forowner = c.forowner or (c.chart22_usrs and c.chart22_usrs[0][0])\ or '' c.selectedowner = c.forowner # Fetch chart data for requested user (owner) for u in allusers: if u[0] == c.forowner: c.chart22_data = u[1:] break else: c.chart22_data = [] elif c.chartname == 'chart23': # Pie chart of types, severity and status for project components allcomps = getattr(c.tcka, 'chart23_data', {}).get(c.project.id, []) componentnames = sorted(map(lambda x: x[0], allcomps)) p = c.projectname fn = lambda comp: (self.url_tckchart(p, 'chart23', comp=comp), comp ) c.ticketcomps = map(fn, componentnames) c.forcomp = c.forcomp or (componentnames and componentnames[0]) or '' c.selectedcomp = c.forcomp # Fetch chart data for requested component for comp in allcomps: if comp[0] == c.forcomp: c.chart23_data = comp[1:] break else: c.chart23_data = [] elif c.chartname == 'chart24': # Pie chart of types, severity and status for project milestones allmstns = getattr(c.tcka, 'chart24_data', {}).get(c.project.id, []) milestonenames = sorted(map(lambda x: x[0], allmstns)) p = c.projectname fn = lambda m: (self.url_tckchart(p, 'chart24', mstn=m), m) c.ticketmstns = map(fn, milestonenames) c.formstn = c.formstn or (milestonenames and milestonenames[0]) or '' c.selectedmstn = c.formstn # Fetch chart data for requested milestone for mstn in allmstns: if mstn[0] == c.formstn: c.chart24_data = mstn[1:] break else: c.chart24_data = [] elif c.chartname == 'chart25': # Pie chart of types, severity and status for project versions allvers = getattr(c.tcka, 'chart25_data', {}).get(c.project.id, []) versionnames = sorted(map(lambda x: x[0], allvers)) p = c.projectname fn = lambda v: (self.url_tckchart(p, 'chart25', ver=v), v) c.ticketvers = map(fn, versionnames) c.forver = c.forver or (versionnames and versionnames[0]) or '' c.selectedver = c.forver # Fetch chart data for requested milestone for ver in allvers: if ver[0] == c.forver: c.chart25_data = ver[1:] break else: c.chart25_data = [] elif c.chartname == 'chart26': # Ticket commentors c.chart26_data = getattr(c.tcka, 'chart26_data', {}).get(c.project.id, []) c.chart26_usrs = getattr(c.tcka, 'chart26_usrs', {}).get(c.project.id, []) c.title = 'TicketCharts' c.rclose.append(render('/derived/projects/ticketcharts.html')) return c.rclose
def test_1_tag(self): """Testing Tag analytics""" log.info("Testing Tag analytics") ta = ca.get_analyticobj('tags') ta.analyse() ta.cacheme() ta = ca.get_analyticobj('tags') attrs = [ 'attachments', 'licenses', 'projects', 'tickets', 'reviews', 'wikipages' ] # chart1_data for t, v in ta.chart1_data.iteritems(): t = tagcomp.get_tag(t) data = [[a, len(getattr(t, a, []))] for a in attrs] assert_equal(sorted(v, key=lambda x: x[0]), sorted(data, key=lambda x: x[0]), 'Mismatch in chart1_data') # chart1_rtags # TODO : not testing the percentile of related tags. for t, v in ta.chart1_rtags.iteritems(): t = tagcomp.get_tag(t) ref = [] for a in attrs: objs = getattr(t, a) ref.extend([ rtag.tagname for obj in objs for rtag in getattr(obj, 'tags', []) if rtag.tagname != t.tagname ]) ref = list(set(ref)) data = map(lambda x: x[0], v) assert_equal(sorted(data), sorted(ref), 'Mismatch in chart1_rtag') # chart4_data for t, atts in ta.chart4_data: t = tagcomp.get_tag(t) ref = sorted([[a.id, a.filename] for a in t.attachments], key=lambda x: x[0]) data = sorted(atts, key=lambda x: x[0]) assert_equal(data, ref, 'Mismatch in chart4_data') # chart4_tags data = [] for a in attachcomp.get_attach(attrload=['tags']): data.extend([t.tagname for t in a.tags]) data = list(set(data)) assert_equal(sorted(data), sorted(ta.chart4_tags), 'Mismatch in chart4_tag') # chart7_data for t, lics in ta.chart7_data: t = tagcomp.get_tag(t) ref = sorted([[l.id, l.licensename] for l in t.licenses], key=lambda x: x[0]) data = sorted(lics, key=lambda x: x[0]) assert_equal(data, ref, 'Mismatch in chart7_data') # chart7_tags data = [] for l in liccomp.get_license(attrload=['tags']): data.extend([t.tagname for t in l.tags]) data = list(set(data)) assert_equal(sorted(data), sorted(ta.chart7_tags), 'Mismatch in chart7_tag') # chart20_data for p, v in ta.chart20_data.iteritems(): p = projcomp.get_project(p) for t, wikis in v: t = tagcomp.get_tag(t) ref = sorted( [[w.id, h.wiki_parseurl(w.wikiurl), w.wikiurl] for w in t.wikipages if w.project == p], key=lambda x: x[0]) data = sorted(wikis, key=lambda x: x[0]) assert_equal(data, ref, 'mismatch in chart20_data') # chart20_tag data = [] projects = projcomp.get_project(attrload=['wikis'], attrload_all=['wikis.tags']) for p in projects: ref = sorted( list(set([t.tagname for w in p.wikis for t in w.tags]))) assert_equal(ref, ta.chart20_tags[p.id], 'mismatch in chart20_tag')
def analytics( self, environ ) : r""" ==== Analytics Project analysis, site analysis and repository analysis > [<PRE paster request <.ini file> /pasteradmin/analytics [anal=anals] >] where, :anals :: comma separated list of one or more of the following values, \\ [<PRE tags attachs users license projects tickets reviews wiki timeline >] If left empty will compute all analytics """ import zeta.lib.analytics as ca allanal = [ 'tags', 'attachs', 'staticwiki', 'users', 'license', 'projects', 'tickets', 'reviews', 'wiki', 'timeline' ] args = cmd_parse_request() anals = args.get( 'anal', None ) anals = h.parse_csv( anals ) if ('all' in anals) or (anals == []) : anals = allanal if 'tags' in anals : print "Computing analytics for tags ..." ta = ca.get_analyticobj( 'tags' ) ta.analyse() ta.cacheme() if 'attachs' in anals : print "Computing analytics for attachments ..." aa = ca.get_analyticobj( 'attachs' ) aa.analyse() aa.cacheme() if 'staticwiki' in anals : print "Computing analytics for static-wiki ..." swa = ca.get_analyticobj( 'staticwiki' ) swa.analyse() swa.cacheme() if 'users' in anals : print "Computing analytics for users ..." aa = ca.get_analyticobj( 'users' ) aa.analyse() aa.cacheme() if 'license' in anals : print "Computing analytics for license ..." la = ca.get_analyticobj( 'license' ) la.analyse() la.cacheme() if 'projects' in anals : print "Computing analytics for project ..." pa = ca.get_analyticobj( 'projects' ) pa.analyse() pa.cacheme() if 'tickets' in anals : print "Computing analytics for tickets ..." ta = ca.get_analyticobj( 'tickets' ) ta.analyse() ta.cacheme() if 'reviews' in anals : print "Computing analytics for reviews ..." ra = ca.get_analyticobj( 'reviews' ) ra.analyse() ra.cacheme() if 'wiki' in anals : print "Computing analytics for wiki ..." wa = ca.get_analyticobj( 'wiki' ) wa.analyse() wa.cacheme() if 'timeline' in anals : print "Computing analytics for timeline ..." tla = ca.get_analyticobj( 'timeline' ) tla.analyse() tla.cacheme()
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