Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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')
Exemplo n.º 3
0
    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')
Exemplo n.º 4
0
    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')
Exemplo n.º 5
0
    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')
Exemplo n.º 6
0
    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')
Exemplo n.º 7
0
    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')
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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')
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
Arquivo: tag.py Projeto: prataprc/zeta
    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
Exemplo n.º 12
0
    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
Exemplo n.º 13
0
    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
Exemplo n.º 14
0
    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
Exemplo n.º 15
0
    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')
Exemplo n.º 16
0
    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
Exemplo n.º 17
0
    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
Exemplo n.º 18
0
    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
Exemplo n.º 19
0
    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
Exemplo n.º 20
0
    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
Exemplo n.º 21
0
    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')
Exemplo n.º 22
0
    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()
Exemplo n.º 23
0
    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