Example #1
0
    def render_admin_panel(self, req, cat, page, path_info):
        add_stylesheet(req, 'googlesads/googleads.css')
        self.log.debug('Saving Google Ads Options')
        if req.method == 'POST':
            self.config.set('google.ads', 'hide_for_authenticated',
                            req.args.get('hide_for_authenticated') in
                            _TRUE_VALUES)
            self.config.save()
            code = req.args.get('ads_html')
            db = self.env.get_db_cnx()
            cursor = db.cursor()
            cursor.execute('SELECT value FROM system WHERE name=%s',
                           ('google.ads_html',))
            if cursor.fetchone():
                self.log.debug('Updating Ads HTML Code')
                cursor.execute('UPDATE system SET value=%s WHERE name=%s',
                               (code, 'google.ads_html'))
            else:
                self.log.debug('Inserting Ads HTML Code')
                cursor.execute('INSERT INTO system (name,value) VALUES (%s,%s)',
                               ('google.ads_html', code))
            db.commit()

            req.redirect(req.href.admin(cat, page))
        self._update_config()
        return 'google_ads_admin.html', {'ads_options': self.options}
Example #2
0
    def process_request(self, req):
        from tractags.macros import TagMacros
        from tractags.parseargs import parseargs
        from trac.web.chrome import add_stylesheet

        add_stylesheet(req, 'tags/css/tractags.css')
        req.hdf['trac.href.tags'] = self.env.href.tags()

        if req.path_info == '/tags':
            index = self.env.config.get('tags', 'index', 'cloud')
            index_kwargs = {'smallest': 10, 'biggest': 30}
            _, config_kwargs = parseargs(self.env.config.get('tags', 'index.args', ''))
            index_kwargs.update(config_kwargs)
            index_kwargs.update(req.args)

            if index == 'cloud':
                req.hdf['tag.body'] = Markup(
                    TagMacros(self.env).render_tagcloud(req, **index_kwargs))
            elif index == 'list':
                req.hdf['tag.body'] = Markup(
                    TagMacros(self.env).render_listtagged(req, **index_kwargs))
            else:
                raise TracError("Invalid index style '%s'" % index)
        else:
            _, args = parseargs(self.env.config.get('tags', 'listing.args', ''))
            args.update(req.args)
            tag = req.path_info[6:]
            req.hdf['tag.name'] = tag
            req.hdf['tag.body'] = Markup(
                TagMacros(self.env).render_listtagged(req, tag, **args))
        return 'tags.cs', None
Example #3
0
 def post_process_request(self, req, template, data, content_type):
     self.log.debug("TicketRefsTemplate: post_process_request, %s, %s" % (
                    req.path_info, template))
     if req.path_info.startswith("/ticket/"):
         add_stylesheet(req, "ticketref/ticket.css")
         add_script(req, "ticketref/ticket.js")
     return template, data, content_type
Example #4
0
    def post_process_request(self, req, template, data, content_type):
        """
        Add pygments colorscheme stylesheet into request
        """
        add_stylesheet(req, '/pygments/{0}.css'.format(self.pygments_theme_name))

        return template, data, content_type
    def filter_stream(self, req, method, filename, stream, data):
        crumbs = self._get_crumbs(req.session)
        if not crumbs:
            return stream
            
        add_stylesheet(req, 'breadcrumbs/css/breadcrumbs.css')
        li = []

        href = req.href(req.base_path)
        
        for crumb in crumbs:
            realm, resource = crumb.split('/', 1)
            name = resource.replace('_', ' ')

            if realm == "ticket":
                name = "#" + resource
            elif realm != "wiki":
                name = "%s:%s" % (realm, name)

            link = req.href(realm, resource)
            
            li.append(
                tag.li(
                    tag.a(title=name, href=link,
                    )(name)
                )
            )
            
        insert = tag.ul(class_="nav", id="breadcrumbs")(("Breadcrumbs:"), li)

        return stream | Transformer('//div[@id="metanav"]/ul').after(insert)
        
Example #6
0
 def post_process_request(self, req, template, data, content_type):
     path = req.path_info
     if path.startswith('/ticket/') or path.startswith('/wiki') \
        or path.startswith('/attachment/'):
         add_script(req, EMBED_PATH_FLOWPLAYER['js'])
         add_stylesheet(req, EMBED_PATH_FLOWPLAYER['css'])
     return template, data, content_type
Example #7
0
 def expand_macro(self, formatter, name, args):
     req = formatter.req
     chrome = Chrome(self.env)
     report = ReportModule(self.env)
     
     comma_splitter = re.compile(r'(?<!\\),')
     kwargs = {}
     for arg in comma_splitter.split(args):
         arg = arg.replace(r'\,', ',')
         m = re.match(r'\s*[^=]+=', arg)
         if m:
             kw = arg[:m.end() - 1].strip()
             value = arg[m.end():]
             if re.match(r'^\$[A-Z]*$', value):
                value = req.args.get(value[1:])
             kwargs[kw] = value if value!= None else ''
         else:
             if re.match(r'^\$[A-Z]*$', arg):
                arg = req.args.get(arg[1:])
             id = int(arg)
     
     req.args = kwargs
     req.args['page'] = '1'
     template, data, content_type = report._render_view(req, id)
     add_stylesheet(req, 'common/css/report.css')
     
     fullpath = ''
     if pkg_resources.resource_exists('wikireport', 'WikiReport.html'):
         fullpath = pkg_resources.resource_filename('wikireport', 'WikiReport.html')
     else:
         filepath = os.path.dirname(os.path.abspath( __file__ ))
         fullpath = os.path.join(filepath, 'WikiReport.html')
 
     return chrome.render_template(req, fullpath, data, None, fragment=True)
Example #8
0
    def process_admin_request(self, req, cat, page, path_info):
        assert req.perm.has_permission('PROJECT_CREATE')
        if page != 'createproj':
            raise TracError("Invalid page %s" % page)

        # filter out the project-specific arguments and remove the prefix
        prefix = 'createproject.'
        projkeys = filter(lambda x: x.startswith(prefix), req.args.iterkeys())
        args = dict((key[len(prefix):], req.args[key]) for key in projkeys)

        if req.method == 'POST':
            # handle form submission
            (projects_root_url, _) = os.path.split(self.env.project_url)
            (projects_root_path, _) = os.path.split(self.env.path)

            project_url = os.path.join(projects_root_url, args['dir_name'])
            path = os.path.join(projects_root_path, args['dir_name'])

            args.setdefault('url', project_url)
            args.setdefault('path', path)

            new_env = self._do_create_proj(args)
            self._add_global_settings(new_env, args)
            self._delete_unwanted_files(new_env)
            req.redirect(project_url)

        args.setdefault('repos_type', 'svn')

        # store the input arguments back in the form fields so the user
        # can correct errors
        for name, val in args.iteritems():
            req.hdf[prefix + name] = val

        add_stylesheet(req, 'createproj/css/createproj.css')
        return 'createproj.cs', None
Example #9
0
 def post_process_request(self, req, template, data, content_type):
     if req.path_info.startswith('/ticket/') or \
        req.path_info.startswith('/newticket'):
         add_script(req, 'keywordsuggest/jquery.bgiframe.min.js')
         add_script(req, 'keywordsuggest/jquery.autocomplete.pack.js')
         add_stylesheet(req, 'keywordsuggest/autocomplete.css')
     return template, data, content_type
Example #10
0
    def expand_layout(self, name, context, options):
        """Specify bootstrap layout template
        """
        req = context.req
        add_stylesheet(req, 'dashboard/css/bootstrap.css')
        add_stylesheet(req, 'dashboard/css/bootstrap-responsive.css')

        if name == 'bootstrap_btnbar':
            self._process_btnbar(req, options)

        results = {
                ('bootstrap_grid', False) : {
                        'template' : 'bs_grid_full.html',
                    },
                ('bootstrap_grid', True) : {
                        'template' : 'bs_grid.html',
                    },
                ('bootstrap_btnbar', False) : {
                        'template' : 'bs_btnbar_full.html',
                    },
                ('bootstrap_btnbar', True) : {
                        'template' : 'bs_btnbar.html',
                    },
            }
        return results[( name , bool(options.get('embed')) )]
Example #11
0
    def render_admin_panel( self, req, cat, page, path_info):
        # here comes the page content, handling, etc.
        try:
          logfile = self.api.get_logfile_name()
          if not logfile:
            self.env.log.debug('No log file configured.')
            self.data['err'].append('There is no log file configured for this environment.')
        except IOError:
          self.env.log.debug('Got IOError - configured log file does not exist!')
          self.data['err'].append('The configured log file does not exist.')

        self.data = {}
        self.data['err'] = []
        self.data['msg'] = []
        self.data['log'] = []
        data = {}

        # OK to process?
        if logfile and req.method=="POST":
          self._do_process(req, logfile)

        # append the messages
        data['us_message'] = self.data['msg']
        data['us_error']   = self.data['err']
        data['us_log']     = self.data['log']

        # adding stylesheets
        add_stylesheet(req, 'logviewer/css/logviewer.css')

        return 'logviewer.html', data
    def filter_stream(self, req, method, filename, stream, data):
        filter_ = []
        if req.path_info.startswith("/ticket"):
            filter_.extend(self._ticket_filter(req, data))
        elif req.path_info.startswith("/timeline"):
            filter_.extend(self._timeline_filter(req, data))
        elif req.path_info.startswith("/browser") or req.path_info.startswith("/changeset"):
            filter_.extend(self._browser_filter(req, data))
        elif req.path_info.startswith("/log"):
            filter_.extend(self._log_filter(req, data))
        elif req.path_info.startswith("/search"):
            filter_.extend(self._search_filter(req, data))
        elif req.path_info.startswith("/report") or req.path_info.startswith("/query"):
            filter_.extend(self._report_filter(req, data))
        elif req.path_info.startswith("/wiki"):
            filter_.extend(self._wiki_filter(req, data))
        elif req.path_info.startswith("/attachment"):
            filter_.extend(self._attachment_filter(req, data))
        
        if 'attachments' in data and data.get('attachments', {}).get('attachments'):
            filter_.extend(self._page_attachments_filter(req, data))

        for f in filter_:
            if f is not None:
                stream |= f

        add_stylesheet(req, 'userpictures/userpictures.css')
        return stream
Example #13
0
    def process_request(self, req):
        req.perm.require(self.BILLING_PERMISSION)
        messages = []

        def addMessage(s):
            messages.extend([s]);

        if req.method == 'POST':
            if req.args.has_key('setbillingtime'):
                self.set_bill_date(req.authname)
                addMessage("All tickets last bill date updated")

        mgr = CustomReportManager(self.env, self.log)
        data = {};
        data["statuses"] = get_statuses(self)
        data["reports"] = mgr.get_reports_by_group(CustomReportManager.TimingAndEstimationKey);
        #self.log.debug("DEBUG got %s, %s" % (data["reports"], type(data["reports"])));
        data["billing_info"] = {"messages":         messages,
                                "href":             req.href.Billing(),
                                "report_base_href": req.href.report(),
                                "usermanual_href":  req.href.wiki(user_manual_wiki_title),
                                "usermanual_title": user_manual_title }

        self.set_request_billing_dates(data)

        add_stylesheet(req, "Billing/billingplugin.css")
        add_script(req, "Billing/date.js")
        add_script(req, "Billing/linkifyer.js")
        return 'billing.html', data, None
Example #14
0
	def process_request(self, req):
		regexp = re.compile(r'^(.+?)(\s(B\[(.*?)\])? C\[(.+?)\] D\[(.+?)\] A\[(.+?)\] E\[(.+?)\] S\[(.+?)\])?$')
		
		p = Popen('git log --graph --date-order -C -M --all --date=iso --pretty=format:"B[%d] C[%H] D[%ad] A[%an] E[%ae] S[%s]"', stdout=PIPE, shell=True, cwd=self.env.get_repository().gitrepo, close_fds=True)
		p_stdoutdata, p_stderrdata = p.communicate()
		graph_raw_list = unicode(p_stdoutdata, 'utf-8', errors="ignore").split("\n")
		
		graph_list = []
		
		for graph_raw_line in graph_raw_list:
			regexp_result = regexp.search(graph_raw_line)
			
			if not regexp_result:
				continue;
			
			graph_list.append({
					"relation":regexp_result.group(1),
					"branch":regexp_result.group(4),
					"rev":regexp_result.group(5),
					"date":regexp_result.group(6),
					"author":regexp_result.group(7),
					"author_email":regexp_result.group(8),
					"subject":regexp_result.group(9),
				}
			)
		
		data = {'graph_list':graph_list}
		add_stylesheet(req, 'gitgraph/gitgraph.css')
		
		add_script(req, 'gitgraph/jquery.js')
		add_script(req, 'gitgraph/gitgraph.js')
		add_script(req, 'gitgraph/chart.js')
		return 'graph.html', data, None
Example #15
0
 def process_request(self, req):
     if not req.perm.has_permission('PROJECT_MANAGER'):
         raise TracError('Need PROJECT_MANAGER permission')
     pages, providers = self._get_pages(req)
     if not pages:
         raise TracError('No projmanager pages available')
     cat_id = req.args.get('cat_id') or pages[0][0]
     page_id = req.args.get('page_id')
     path_info = req.args.get('path_info')
     if not page_id:
         page_id = filter(lambda page: page[0] == cat_id, pages)[0][2]
     
     provider = providers.get((cat_id, page_id), None)
     if not provider:
         raise TracError('Unknown Proj Manager Page')
     
     # Do the action
     template, content_type = provider.process_projmanager_request(req, cat_id,
                                                             page_id,
                                                             path_info)
     # Get the list of pages
     req.hdf['projmanager.pages'] = [{'cat_id': page[0],
                                'cat_label': page[1],
                                'page_id': page[2],
                                'page_label': page[3],
                                'href': self.env.href.projmanager(page[0], page[2])
                                } for page in pages]
     req.hdf['projmanager.active_cat'] = cat_id
     req.hdf['projmanager.active_page'] = page_id
     req.hdf['projmanager.page_template'] = template
     add_stylesheet(req, 'projmanager/css/projmanager.css')
     return 'projmanager.cs', content_type
    def post_process_request(self, req, template, data, content_type):
        """Do any post-processing the request might need; typically adding
        values to the template `data` dictionary, or changing template or
        mime type.
        
        `data` may be update in place.

        Always returns a tuple of (template, data, content_type), even if
        unchanged.

        Note that `template`, `data`, `content_type` will be `None` if:
         - called when processing an error page
         - the default request handler did not return any result

        (Since 0.11)
        """
        if template == 'ticket.html':
            add_stylesheet(req, '%s/css/autocomplete.css' % self.prefix)
            add_script(req, '%s/js/autocomplete.js' % self.prefix)
            restrict_owner = self.env.config.getbool('ticket', 'restrict_owner')
            add_script(req, '%s/js/format_item.js' % self.prefix)
            if req.path_info.rstrip() == '/newticket':
                add_script(req, '%s/js/autocomplete_newticket_cc.js' % self.prefix)
                if not restrict_owner:
                    add_script(req, '%s/js/autocomplete_newticket.js' % self.prefix)
            else:
                add_script(req, '%s/js/autocomplete_ticket_cc.js' % self.prefix)
                if not restrict_owner:
                    add_script(req, '%s/js/autocomplete_ticket.js' % self.prefix)
        return (template, data, content_type)
Example #17
0
    def _prepare_diff(self, req, page, old_text, new_text,
                      old_version, new_version):
        diff_style, diff_options, diff_data = get_diff_options(req)
        diff_context = 3
        for option in diff_options:
            if option.startswith('-U'):
                diff_context = int(option[2:])
                break
        if diff_context < 0:
            diff_context = None
        diffs = diff_blocks(old_text, new_text, context=diff_context,
                            ignore_blank_lines='-B' in diff_options,
                            ignore_case='-i' in diff_options,
                            ignore_space_changes='-b' in diff_options)
        def version_info(v, last=0):
            return {'path': get_resource_name(self.env, page.resource),
                    # TRANSLATOR: wiki page
                    'rev': v or _('currently edited'),
                    'shortrev': v or last + 1,
                    'href': req.href.wiki(page.name, version=v) if v else None}
        changes = [{'diffs': diffs, 'props': [],
                    'new': version_info(new_version, old_version),
                    'old': version_info(old_version)}]

        add_stylesheet(req, 'common/css/diff.css')
        add_script(req, 'common/js/diff.js')
        return diff_data, changes
Example #18
0
 def post_process_request(self, req, template, content_type):
     if template == 'ticket.cs' and req.perm.has_permission('TICKET_ADMIN'):
         add_script(req, 'ticketdelete/jquery.js')
         add_script(req, 'ticketdelete/ticketdelete.js')
         add_stylesheet(req, 'ticketdelete/ticketdelete.css')
         add_script(req, 'ticketchange/ticketchange.js')
     return template, content_type
Example #19
0
    def post_process_request(self, req, template, data, content_type):
        if data is None:
            return

        js_data = {
            'comments_rest_url': req.href(CommentsREST.href),
            'formatting_help_url': req.href.wiki('WikiFormatting'),
            'delete_url': req.href(DeleteCommentForm.href),
            'preview_url': req.href(WikiPreview.href),
            'templates': self.templates_js_data(),
            'active_comment_id': req.args.get('codecomment'),
            'username': req.authname,
            'is_admin': 'TRAC_ADMIN' in req.perm,
        }

        original_return_value = template, data, content_type
        if req.path_info.startswith('/changeset/'):
            js_data.update(self.changeset_js_data(req, data))
        elif req.path_info.startswith('/browser'):
            js_data.update(self.browser_js_data(req, data))
        elif re.match(r'/attachment/ticket/\d+/.*', req.path_info):
            js_data.update(self.attachment_js_data(req, data))
        else:
            return original_return_value

        add_script(req, 'code-comments/json2.js')
        add_script(req, 'code-comments/underscore-min.js')
        add_script(req, 'code-comments/backbone-min.js')
        # jQuery UI includes: UI Core, Interactions, Button & Dialog Widgets, Core Effects, custom theme
        add_script(req, 'code-comments/jquery-ui/jquery-ui.js')
        add_stylesheet(req, 'code-comments/jquery-ui/trac-theme.css')
        add_script(req, 'code-comments/jquery.ba-throttle-debounce.min.js')
        add_script(req, 'code-comments/code-comments.js')
        add_script_data(req, {'CodeComments': js_data})
        return original_return_value
Example #20
0
 def _do_login(self, req):
     # check the referer
     referer = req.get_header('Referer')
     if referer and not (referer == req.base_url or referer.startswith(req.base_url.rstrip('/')+'/')):
         # only redirect to referer if it is from the same site
         referer = None
     if referer:
        req.session['oid.referer'] = referer
     if self.default_openid:
        req.args['openid_identifier'] = self.default_openid
        return self._do_verify(req)
     add_stylesheet(req, 'authopenid/css/openid.css')
     add_script(req, 'authopenid/js/openid-jquery.js')
     return 'openidlogin.html', {
         'images': req.href.chrome('authopenid/images') + '/',
         'action': req.href.openidverify(),
         'message': 'Login using OpenID.',
         'signup': self.signup_link,
         'whatis': self.whatis_link,
         'css_class': 'error',
         'providers_regexp': self.providers_regexp,
         'custom_provider_name': self.custom_provider_name,
         'custom_provider_label': self.custom_provider_label,
         'custom_provider_url': self.custom_provider_url,
         'custom_provider_image': self.custom_provider_image,
         'custom_provider_size': self.custom_provider_size,
         }, None
Example #21
0
    def process_request(self, req):
        from tractags.api import TagEngine
        from trac.web.chrome import add_stylesheet

        add_stylesheet(req, 'tags/css/tractags.css')

        pagename = req.args.get('page', 'WikiStart')
        action = req.args.get('action', 'view')

        engine = TagEngine(self.env)
        wikitags = engine.tagspace.wiki
        tags = list(wikitags.get_tags([pagename]))
        tags.sort()

        if action == 'edit':
            req.hdf['tags'] = req.args.get('tags', ', '.join(tags))
        elif action == 'view':
            hdf_tags = []
            for tag in tags:
                href, title = engine.get_tag_link(tag)
                hdf_tags.append({'name': tag,
                                 'href': href,
                                 'title': title})
            req.hdf['tags'] = hdf_tags
        result = WikiModule.process_request(self, req)
        if result is None:
            return None
        if result[0] == 'wiki.cs':
            return 'tagswiki.cs', None
        return result
Example #22
0
    def list_users(self, req):
        """
        Handle user listing
        """
        req.perm.require('USER_AUTHOR')

        data = {}
        userstore = get_userstore()

        # State
        data['states'] = userstore.USER_STATUS_LABELS

        # Available backend organizations
        # TODO: Add support for listing users based on organization in user REST API
        orgman = self.env[OrganizationManager]
        data['organizations'] = [org for org in orgman.get_organizations() if org['type'] == 'backend']

        # Add jquery ui for autocomplete
        add_script(req, 'multiproject/js/jquery-ui.js')
        add_script(req, 'multiproject/js/transparency.js')
        add_script(req, 'multiproject/js/multiproject.js')
        add_script(req, 'multiproject/js/admin_user_list.js')
        add_stylesheet(req, 'multiproject/css/jquery-ui.css')

        return 'admin_user_list.html', data
Example #23
0
    def render_admin_panel(self, req, cat, page, path_info):
        if req.method == 'POST':
            self.config.set('theme', 'theme', req.args['theme'].lower())
            self.config.save()
            
            req.redirect(req.href.admin(cat, page)) 
        
        data = {
            'themeengine': {
                'info': self.system.info.items(),
            },
        }

        theme_name = self.system.theme and self.system.theme['name'] or 'default'
        theme_name = theme_name.islower() and theme_name.title() or theme_name
        data['themeengine']['current'] = theme_name
        index = 0
        curtheme = None
        for i, (k, v) in enumerate(data['themeengine']['info']):
            if k.lower() == theme_name.lower():
                index = i
                curtheme = v
                break
        data['themeengine']['current_index'] = index
        data['themeengine']['current_theme'] = curtheme
            
        #add_stylesheet(req, 'themeengine/jquery.jcarousel.css')
        #add_stylesheet(req, 'themeengine/skins/tango/skin.css')
        #add_script(req, 'themeengine/jquery.jcarousel.pack.js')
        add_stylesheet(req, 'themeengine/admin.css')
        add_script(req, 'themeengine/jcarousellite_1.0.1.js')
        return 'admin_theme.html', data
Example #24
0
    def process_request(self, req):
        # Create request context.
        context = Context.from_request(req)
        context.realm = 'screenshots-core'

        # Template data dictionary.
        req.data = {}

        # Get database access.
        db = self.env.get_db_cnx()
        context.cursor = db.cursor()

        # Prepare data structure.
        req.data['title'] = self.mainnav_title or self.metanav_title
        req.data['has_tags'] = self.env.is_component_enabled(
          'tracscreenshots.tags.ScreenshotsTags')

        # Get action from request and perform them.
        actions = self._get_actions(context)
        self.log.debug('actions: %s' % (actions,))
        template, content_type = self._do_actions(context, actions)

        # Add CSS style and JavaScript scripts.
        add_stylesheet(req, 'screenshots/css/screenshots.css')
        add_script(req, 'screenshots/js/screenshots.js')

        # Return template and its data.
        db.commit()
        return (template + '.html', {'screenshots' : req.data}, content_type)
Example #25
0
	def match_request(self, req):
		"""
			Never Match a request but always load the css, trac seems
			to do some caching, so this only happens once per session?
		"""
		add_stylesheet(req, 'shellexampleHdocs/css/shellexample.css')
		return False;
Example #26
0
    def expand_macro(self, formatter, name, content):
        req = formatter.req
        stats_provider, kwargs, is_preview_with_self = self._parse_macro_content(content, req)

        if is_preview_with_self:
            # previewing newticket, without a number but with a reference
            # to current ticket number; show a helpful message
            return tag.div('Progress meter will be inserted here in final ticket')

        # Create & execute the query string
        qstr = '&'.join(['%s=%s' % item
                               for item in kwargs.iteritems()])
        query = Query.from_string(self.env, qstr, max=0)
        try:
            constraints = query.constraints[0]
        except IndexError:
            constraints = query.constraints

        # Calculate stats
        qres = query.execute(req)
        tickets = apply_ticket_permissions(self.env, req, qres)

        stats = get_ticket_stats(stats_provider, tickets)
        stats_data = query_stats_data(req, stats, constraints)

        # ... and finally display them
        add_stylesheet(req, 'common/css/roadmap.css')
        chrome = Chrome(self.env)
        return chrome.render_template(req, 'progressmeter.html', stats_data,
                                      fragment=True)
Example #27
0
    def process_admin_request(self, req, cat, page, path_info):
        assert req.perm.has_permission('BLOG_ADMIN')

        add_stylesheet(req, 'blog/css/blog.css')
        add_stylesheet(req, 'common/css/wiki.css')

        req.hdf['blogadmin.page'] = page

        admin_fields = {
                        'date_format'    : '%x %X',
                        'page_format'    : '%Y/%m/%d/%H.%M',
                        'default_tag'    : 'blog', 
                        'post_size'      : 1024,
                        'history_days'   : 30,
                        'new_blog_link'  : 'New Blog Post',
                        'first_week_day' : 'SUNDAY',
                        'mark_updated'   : 'true',
                        'nav_link'       : 'Blog',
                        'nav_bar'        : 'true',
                        'macro_blacklist': '',
                        'rss'            : 'true',
                       }
        if req.method == 'POST':
            if page == 'defaults':
                for field in admin_fields.keys():
                    self._set_field_value(req, field)
                self.env.config.save()
        for field, default in admin_fields.items():
            self._get_field_value(req, field, default)
        req.hdf['blogadmin.docs'] = wiki_to_html(self._get_docs(page),
                                                 self.env, req)
        return 'blog_admin.cs', None
    def post_process_request(self, req, template, data, content_type):
        """Do any post-processing the request might need; typically adding
        values to the template `data` dictionary, or changing template or
        mime type.
        
        `data` may be update in place.

        Always returns a tuple of (template, data, content_type), even if
        unchanged.

        Note that `template`, `data`, `content_type` will be `None` if:
         - called when processing an error page
         - the default request handler did not return any result

        (Since 0.11)
        """
        if template == 'ticket.html':
            add_stylesheet(req, '%s/css/autocomplete.css' % self.prefix)
            add_script(req, '%s/js/autocomplete.js' % self.prefix)
            if req.path_info.rstrip() == '/newticket':
                add_script_data(req, {'KEYWORDS_AC_PATH': 'ac-keywords'})
            else:
                add_script_data(req, {'KEYWORDS_AC_PATH': '../ac-keywords'})
            add_script(req, '%s/js/autocomplete_ticket_keywords.js' % self.prefix)
        return (template, data, content_type)
Example #29
0
 def prepare_for_action(self, req):
     add_stylesheet(req, 'pmmm/pmmm.css')
     self.is_project_admin = req.perm.has_permission("PROJECT_ADMIN")
     self.is_trac_admin = req.perm.has_permission("TRAC_ADMIN")
     self.is_dep_admin = req.perm.has_permission("DEPARTMENT_ADMIN")
     self.log.debug("User %s is_admin %d" % (req.authname,
                                              self.is_project_admin))
Example #30
0
    def process_request(self, req):
        req.perm.assert_permission('TICKET_VIEW')

        action = req.args.get('action', 'view')

        if not req.args.has_key('id'):
            req.redirect(self.env.href.wiki())

        db = self.env.get_db_cnx()
        id = int(req.args.get('id'))

        ticket = Ticket(self.env, id, db=db)
        reporter_id = util.get_reporter_id(req)

        if req.method == 'POST':
            if not req.args.has_key('preview'):
                self._do_save(req, db, ticket)
            else:
                # Use user supplied values
                ticket.populate(req.args)
                req.hdf['ticket.action'] = action
                req.hdf['ticket.ts'] = req.args.get('ts')
                req.hdf['ticket.reassign_owner'] = req.args.get('reassign_owner') \
                                                   or req.authname
                req.hdf['ticket.resolve_resolution'] = req.args.get('resolve_resolution')
                reporter_id = req.args.get('author')
                comment = req.args.get('comment')
                if comment:
                    req.hdf['ticket.comment'] = comment
                    # Wiki format a preview of comment
                    req.hdf['ticket.comment_preview'] = wiki_to_html(comment,
                                                                     self.env,
                                                                     req, db)
        else:
            req.hdf['ticket.reassign_owner'] = req.authname
            # Store a timestamp in order to detect "mid air collisions"
            req.hdf['ticket.ts'] = ticket.time_changed

        self._insert_ticket_data(req, db, ticket, reporter_id)

        # If the ticket is being shown in the context of a query, add
        # links to help navigate in the query result set
        if 'query_tickets' in req.session:
            tickets = req.session['query_tickets'].split()
            if str(id) in tickets:
                idx = tickets.index(str(ticket.id))
                if idx > 0:
                    add_link(req, 'first', self.env.href.ticket(tickets[0]),
                             'Ticket #%s' % tickets[0])
                    add_link(req, 'prev', self.env.href.ticket(tickets[idx - 1]),
                             'Ticket #%s' % tickets[idx - 1])
                if idx < len(tickets) - 1:
                    add_link(req, 'next', self.env.href.ticket(tickets[idx + 1]),
                             'Ticket #%s' % tickets[idx + 1])
                    add_link(req, 'last', self.env.href.ticket(tickets[-1]),
                             'Ticket #%s' % tickets[-1])
                add_link(req, 'up', req.session['query_href'])

        add_stylesheet(req, 'common/css/ticket.css')
        return 'ticket.cs', None
Example #31
0
    def process_request(self, req):
        add_stylesheet(req, 'redports/redports.css')
        add_script(req, 'redports/flot/jquery.flot.js')
        add_ctxtnav(req, _('Environments'), req.href.buildgroups())
        add_ctxtnav(req, _('Statistics'), req.href.buildstats())

        if req.args.get('owner', None) != None:
            username = req.args.get('owner', None)
        elif req.authname != 'anonymous':
            username = req.authname
        else:
            username = None

        return ('buildstats.html', {
            'alljobs': BuildstatsAllIterator(self.env),
            'userjobs': BuildstatsUserIterator(self.env, username),
            'userjobname': username,
            'authname': req.authname
        }, None)
Example #32
0
    def _wiki_view(self, req, stream):
        add_stylesheet(req, 'tags/css/tractags.css')
        tags = self._page_tags(req)
        if not tags:
            return stream
        tag_system = TagSystem(self.env)
        li = []
        for tag_ in tags:
            resource = Resource('tag', tag_)
            anchor = render_resource_link(self.env,
                                          Context.from_request(req, resource),
                                          resource)
            anchor = anchor(rel='tag')
            li.append(tag.li(anchor, ' '))

        # TRANSLATOR: Header label text for tag list at wiki page bottom.
        insert = tag.ul(class_='tags')(tag.li(_("Tags"), class_='header'), li)
        return stream | Transformer(
            '//div[contains(@class,"wikipage")]').after(insert)
Example #33
0
    def expand_macro(self, formatter, name, content):
        args, kw = parse_args(content)
        args = [arg.strip() for arg in args]

        stack_names = kw.get('stack', '').split('|')
        if not stack_names:
            raise TracError('Missing stack names')

        stacks = CardStack.select_by_names(self.env, stack_names)

        cards = Card.select_by_stacks(self.env, stack_names)

        labels = [label for label in kw.get('label', '').split('|') if label]
        labels = dict(zip(stack_names, labels + stack_names[len(labels):]))

        width = int(kw.get('width', 400))

        req = formatter.req
        context = formatter.context

        board_data = {
            'form_token': req.form_token,
            'api_url': formatter.href('card'),
            'cards_by_id': serialized_cards_by_id(cards, self.env, context),
            'stacks_by_name': serialized_stacks_by_name(stacks, stack_names),
            'auto_refresh': self.auto_refresh,
            'auto_refresh_interval': self.auto_refresh_interval,
        }
        board_data_id = '%012x' % id(board_data)
        
        chrome = Chrome(self.env)
        add_stylesheet(req, 'cards/css/cards.css')
        chrome.add_jquery_ui(req)
        add_script_data(req, {'cards_%s' % board_data_id: board_data})
        add_script(req, 'cards/js/cards.js')

        data = {
            'board_data_id': board_data_id,
            'stack_names': stack_names,
            'labels': labels,
            'width': width,
        }
        return chrome.render_template(req, 'cards_macro.html', data, 'text/html', True)
Example #34
0
    def filter_stream(self, req, method, filename, stream, data):
        if req.path_info.startswith('/timeline'):
            closure_state = [0]
            cache = {}

            def f(stream):
                # Update the closed value
                n = closure_state[0]
                closure_state[0] += 1

                # Extract the user information
                author = data['events'][n]['author'].strip()
                user_info = cache.get(author)
                if user_info is not None:
                    author, name, email = user_info
                else:
                    db = self.env.get_db_cnx()
                    user_info = self._get_info(author, db)
                    cache[author] = user_info
                    author, name, email = user_info

                # Try to find a provider
                for provider in self.providers:
                    href = provider.get_hackergotchi(req.href, author, name,
                                                     email)
                    if href is not None:
                        break
                else:
                    href = req.href.chrome('hackergotchi', 'default.png')

                # Build our element
                elm = tag.img(src=href,
                              alt='Hackergotchi for %s' % author,
                              class_='hackergotchi')

                # Output the combined stream
                return itertools.chain(elm.generate(), stream)

            stream |= Transformer(
                '//div[@id="content"]/dl/dt/a/span[@class="time"]').filter(f)
            add_stylesheet(req, 'hackergotchi/hackergotchi.css')
        return stream
Example #35
0
File: api.py Project: zxfly/trac
    def send_error(self, exc_info, template='error.html',
                   content_type='text/html', status=500, env=None, data={}):
        try:
            if template.endswith('.html'):
                if env:
                    from trac.web.chrome import Chrome, add_stylesheet
                    add_stylesheet(self, 'common/css/code.css')
                    metadata = {'content_type': 'text/html'}
                    try:
                        out = Chrome(env).render_template(self, template, data,
                                                          metadata)
                    except Exception:
                        # second chance rendering, in "safe" mode
                        data['trac_error_rendering'] = True
                        out = Chrome(env).render_template(self, template, data,
                                                          metadata)
                else:
                    content_type = 'text/plain'
                    out = '%s\n\n%s: %s' % (data.get('title'),
                                             data.get('type'),
                                             data.get('message'))
        except Exception: # failed to render
            out = get_last_traceback()
            content_type = 'text/plain'

        if isinstance(out, unicode):
            out = out.encode('utf-8')

        self.send_response(status)
        self._outheaders = []
        self.send_header('Cache-Control', 'must-revalidate')
        self.send_header('Expires', 'Fri, 01 Jan 1999 00:00:00 GMT')
        self.send_header('Content-Type', content_type + ';charset=utf-8')
        self.send_header('Content-Length', len(out))
        self._send_cookie_headers()

        self._write = self._start_response(self._status, self._outheaders,
                                           exc_info)

        if self.method != 'HEAD':
            self.write(out)
        raise RequestDone
Example #36
0
    def render_admin_panel(self, req, cat, page, path_info):
        req.perm.require("TRAC_ADMIN")
        arch = ProjectArchive()
        projects = arch.list()

        if req.method == 'POST':
            archived_project_id = int(req.args.get('archived_project_id', 0))
            action = req.args.get('action', 'noop')

            try:
                if action == 'restore':
                    if arch.restore(archived_project_id, self.env):
                        add_notice(req, _('Restored project successfully'))

                elif action == 'remove':
                    if arch.remove(archived_project_id):
                        add_notice(req, _('Removed project successfully'))

                elif action == 'remove_expired':
                    if arch.remove_expired():
                        add_notice(req,
                                   _('Removed expired projects successfully'))

                else:
                    add_warning(req, _('Unknown action'))

            except Exception:
                add_warning(req, _('Failed to complete the action'))
                self.log.exception('Failed to {0} for project {1}'.format(
                    action, archived_project_id))

            # After post method, redirect back to listing
            return req.redirect(req.href('/admin/projects/prjarchive'))

        add_script(req, 'multiproject/js/jquery-ui.js')
        add_stylesheet(req, 'multiproject/css/jquery-ui.css')
        add_script(req, 'multiproject/js/multiproject.js')
        add_script(req, 'multiproject/js/admin_project_archive.js')

        return 'multiproject_admin_project_archive.html', {
            'projects': projects
        }
Example #37
0
    def render_admin_panel(self, req, cat, page, path_info):
        """
        Returns the admin view and handles the form actions
        """
        req.perm.require('TRAC_ADMIN')
        if req.method == 'POST':
            if req.args.get("repos[]"):
                self.delete(req.args.get("repos[]"))
                url = "/admin/general/vcm"
                req.redirect(req.href(url))
            elif req.args.get("repo_name") and req.args.get("repo_type"):
                self.add_repository(req.args.get("repo_name"),
                                    req.args.get("repo_type"), req)
        add_script(req, 'multiproject/js/admin_vcm.js')
        add_stylesheet(req, 'multiproject/css/vcm.css')
        vcs_types = self.get_enabled_vcs(self.env)
        repos = self.get_repositories()
        data = {'repositories': repos, 'repository_types': vcs_types}

        return 'admin_vcm.html', data
Example #38
0
    def expand_macro(self, formatter, name, content):
        '''
        Wiki Macro Method which generates a Genshi Markup Stream
      '''
        # conf = PPConfiguration( self.env )
        macroenv = PPEnv(self.env, formatter.req, content)

        addExternFiles(formatter.req)
        # needed because of ajax call while showing ticket details (on mouseover)
        add_stylesheet(formatter.req, 'common/css/ticket.css')

        if macroenv.conf.get('use_ajax_for_fetching_reports',
                             'enabled') == 'enabled':
            # HTML block with AJAX load block
            return ProjectPlanGenerator.get_ajax(macroenv, formatter.req,
                                                 content)
        else:
            # HTML block embedding finished rendered report block
            return ProjectPlanGenerator.get_html(macroenv, formatter.req,
                                                 content)
Example #39
0
 def do_get(self, req):
     # Metrics is higher in the hierarchy
     from agilo.scrum.metrics import MetricsController
     
     add_stylesheet(req, "common/css/report.css")
     get_team = TeamController.GetTeamCommand(self.env, team=req.args['name'])
     team = self.controller.process_command(get_team)
     req.perm.assert_permission(Action.TEAM_VIEW, team.resource)
     
     cmd = MetricsController.ListMetricsCommand(self.env, team=team.name)
     metrics_by_sprint = MetricsController(self.env).process_command(cmd)
     
     available_metrics = self._get_available_metrics(metrics_by_sprint)
     data = {'team': team}
     data['chart_widgets'] = self._get_charts(req, team, available_metrics)
     data['metric_labels'] = [get_label(m) for m in available_metrics]
     data['metric_names'] = available_metrics
     data['sprints'] = self._format_sprint_and_metrics(req, metrics_by_sprint,
                                                       available_metrics, team)
     return data
Example #40
0
class TeamCityAdmin(Component):
    implements(IAdminPanelProvider)

    def get_admin_panels(self, req):
        if req.perm.has_permission('TEAMCITY_ADMIN'):
            yield ('teamcity', 'TeamCity', 'builds', 'Builds')

    def render_admin_panel(self, req, category, page, path_info):
        if not req.perm.has_permission('TEAMCITY_ADMIN'):
            raise HTTPForbidden('You are not allowed to configure TC plugin')
        if req.method == 'POST':
            options, errors = self._save_options(req.args)
            if not errors:
                # redirect here
                req.redirect(req.href(req.path_info))
        else:
            options, errors = get_options(self.config), []
        tc = TeamCityQuery(options)
        url = "%s/httpAuth/app/rest/buildTypes" % options['base_url']
        # load builds from TC using REST API
        try:
            builds_xml = tc.xml_query(url)
        except TeamCityError, e:
            errors.append("Fix base config options: %s" % e)
            t_data = {'options': options, 'projects': {}, 'errors': errors}
            return 'teamcity_admin.html', t_data
        projects = {}
        for build in builds_xml.iterfind('buildType'):
            pr_name = build.attrib['projectName']
            pr_id = build.attrib['projectId']
            if pr_id not in projects:
                projects[pr_id] = {
                    'id': pr_id,
                    'name': pr_name,
                    'checked': False,
                    'builds': []
                }
            btype_id = build.attrib['id']
            if btype_id in options.get('builds', []):
                projects[pr_id]['checked'] = True
            projects[pr_id]['builds'].append({
                'btype_id':
                btype_id,
                'btype_name':
                build.attrib['name'],
                'btype_url':
                build.attrib['webUrl'],
                'checked':
                btype_id in options.get('builds', [])
            })
        add_stylesheet(req, 'teamcity/css/admin.css')
        add_javascript(req, 'teamcity/js/admin.js')
        t_data = {'options': options, 'projects': projects, 'errors': errors}
        return 'teamcity_admin.html', t_data
Example #41
0
    def process_request(self, req):
        panel_id = req.args['panel_id']

        panels = []
        chosen_provider = None

        for provider in self.panel_providers:
            for name, label in provider.get_preference_panels(req) or []:
                if name == panel_id or None:
                    chosen_provider = provider
                panels.append((name, label))
        if not chosen_provider:
            self.log.warn('Unknown preference panel %r', panel_id)
            raise HTTPNotFound(_('Unknown preference panel'))

        template, data = chosen_provider.render_preference_panel(req, panel_id)
        data.update({'active_panel': panel_id, 'panels': panels})

        add_stylesheet(req, 'common/css/prefs.css')
        return template, data, None
Example #42
0
 def filter_stream(self, req, method, filename, stream, formdata):
     # Don't check for req.path_info == '/query'. This will cause an
     # infinite loop. I think it is matching the actual QueryModule 
     # component then.
     if filename == 'query.html':
         self.log.debug("WhiteboardPlugin: rendering template")
         add_script(req, 'whiteboard/js/jquery.equalheights.js')
         add_script(req, 'whiteboard/js/jquery-ui.js')
         add_script(req, 'whiteboard/js/whiteboard.js')
         add_stylesheet(req, 'whiteboard/css/whiteboard.css')
         add_ctxtnav(req, "Whiteboard", "/#whiteboard")
         
         formdata['query_href']= req.session['query_href'] \
                                  or req.href.query()
         
         whiteboard_stream = Chrome(self.env).render_template(req, 
             'whiteboard.html', formdata, fragment=True)
         return stream | Transformer('//h2[@class="report-result"]..'). \
             before(whiteboard_stream.select('//form[@id="whiteboard_form"]'))
     return stream
Example #43
0
    def pre_process_request(self, req, handler):
        tags = req.args.get('tags')
        if isinstance(handler, WikiModule):
            add_stylesheet(req, 'tags/css/tractags.css')

            if req.method == 'POST' and tags is not None:
                page_name = req.path_info[6:] or 'WikiStart'
                new_tags = set(
                    [t.strip() for t in tags.split(',') if t.strip()])
                old_tags = TagEngine(self.env).tagspace.wiki.get_tags(
                    [page_name])
                if old_tags != new_tags:
                    TagEngine(self.env).tagspace.wiki.replace_tags(
                        req, page_name, new_tags)
                    if req.args.get('text') == WikiPage(self.env,
                                                        page_name).text:
                        # The wiki module would think this is wasn't changed,
                        # so redirect around it.
                        req.redirect(req.href.wiki(page_name))
        return handler
Example #44
0
    def process_request(self, req):
        header = req.get_header('X-Requested-With')
        if not header or header.lower() != 'xmlhttprequest':
            # Not an XHR request from the debugger, so send a help page
            add_stylesheet(req, 'common/css/code.css')
            return 'developer/debug_help.html', {}, None

        path = req.args['path']
        token = req.args['token']
        assert path is not None and token is not None

        key = token + ':' + path.split(':', 1)[0]
        data = self._cache.get(key)
        if not data:
            raise HTTPNotFound()
        node = data.lookup(path)
        data = {'node': node, 'drillable': self._is_drillable(req)}
        output = Chrome(self.env).render_template(req, 'developer/debug_node.html',
                                                  data, fragment=True)
        req.send(output.render('xhtml'), 'text/html')
Example #45
0
    def show_repositories(self, req):
        if req.method == 'POST':
            if req.args.get('delete') and req.args.get('id'):
                repo = PortRepository(self.env, req.args.get('id'))
                repo.delete()
                req.redirect(req.href.admin('redports/repository'))
            elif req.args.get('add'):
                repo = PortRepository(self.env, req.args.get('id'))
                repo.type = req.args.get('type')
                repo.name = req.args.get('name')
                repo.url = req.args.get('url')
                repo.browseurl = req.args.get('browseurl')
                repo.username = req.args.get('username')
                repo.add()
                req.redirect(req.href.admin('redports/repository'))

        add_stylesheet(req, 'redports/redports.css')
        return 'adminrepositories.html', {
                 'repositories': PortRepositoryIterator(self.env)
               }
Example #46
0
    def render_preference_panel(self, req, panel):
        styles = list(get_all_styles())

        if req.method == 'POST':
            style = req.args.get('style')
            if style and style in styles:
                req.session['pygments_style'] = style
                add_notice(req, _("Your preferences have been saved."))
            req.redirect(req.href.prefs(panel or None))

        for style in sorted(styles):
            add_stylesheet(req,
                           '/pygments/%s.css' % style,
                           title=style.title())
        output = self._generate('html', self.EXAMPLE)
        return 'prefs_pygments.html', {
            'output': output,
            'selection': req.session.get('pygments_style', self.default_style),
            'styles': styles
        }
Example #47
0
    def render_preference_panel(self, req, panel):
        """Process a request for a preference panel."""
        notifier = self.env[GrowlNotifierSystem]
        sources = notifier.get_available_sources()

        if req.method == 'POST':
            if 'GROWL_MODIFY' not in req.perm:
                raise PermissionError("No permission to change Growl settings")
            host = req.args.get('host')
            if notifier.validate_host('GROWL_ADMIN' in req.perm, host):
                req.session['growl.host'] = host
                # send a registration request to the host
                notifier.register_notifications([host])
            if True:
                for source in sources:
                    key = 'growl.source.%s' % source
                    if source in req.args:
                        req.session[key] = '1'
                    elif key in req.session:
                        del req.session[key]

            req.redirect(req.href.prefs(panel or None))

        data = {}
        data['sources'] = []
        for source in sources:
            label = '%s%s' % (source[0].upper(), source[1:])
            key = 'growl.source.%s' % source
            enabled = req.session.has_key(key) and req.session[key]
            data['sources'].append({
                'name': source,
                'label': label,
                'enabled': enabled
            })
        data['host'] = req.session.has_key('growl.host') and \
                           req.session['growl.host']
        data['settings'] = {'session': req.session}

        # add custom stylesheet
        add_stylesheet(req, 'growl/css/growl.css')
        return 'pref_growl.html', data
Example #48
0
    def process_request(self, req):
        path = req.args.get('path', '/')
        rev = req.args.get('rev')

        repos = self.env.get_repository(req.authname)
        node = repos.get_node(path, rev)

        hidden_properties = [
            p.strip() for p in self.config.get('browser', 'hide_properties',
                                               'svk:merge').split(',')
        ]
        req.hdf['title'] = path
        req.hdf['browser'] = {
            'path':
            path,
            'revision':
            rev or repos.youngest_rev,
            'props':
            dict([(util.escape(name), util.escape(value))
                  for name, value in node.get_properties().items()
                  if not name in hidden_properties]),
            'href':
            util.escape(
                self.env.href.browser(path, rev=rev or repos.youngest_rev)),
            'log_href':
            util.escape(self.env.href.log(path))
        }

        path_links = get_path_links(self.env.href, path, rev)
        if len(path_links) > 1:
            add_link(req, 'up', path_links[-2]['href'], 'Parent directory')
        req.hdf['browser.path'] = path_links

        if node.isdir:
            req.hdf['browser.is_dir'] = True
            self._render_directory(req, repos, node, rev)
        else:
            self._render_file(req, repos, node, rev)

        add_stylesheet(req, 'common/css/browser.css')
        return 'browser.cs', None
Example #49
0
    def filter_stream(self, req, method, filename, stream, data):
        if filename == "ticket.html" and 'ticket' in data:
            ticket = data['ticket']

            if ticket.id > 0 and self._have_schedule(ticket):

                add_stylesheet(req, 'ticketrelation/css/schedule.css')

                schedule = self._get_schedule_info(ticket)

                stream |= Transformer('//div[@id="ticket"]').after(
                    tag.div(
                        tag.h3(
                            tag.a('Schedule', id='schedule_label', href='#schedule_label'),
                        class_='foldable'),
                        tag.div(tag.schedule(**{':schedule': 'schedule', ':config': 'config'}), class_='schedule_container', id='schedule_container'),
                    id='schedule')
                )

                config = {
                    'url': req.base_url,
                    'startDate': None,
                    'finishDate': None,
                    'showUnavailable': 1
                }

                stream |= Transformer('//body').append(tag.script("""
                    $(window).load(function() {
                        var data = %s;
                        var config = %s;
                        var app = new Vue({
                            el: '#schedule_container',
                            data: {
                                schedule: data,
                                config: config,
                            }
                        });
                    });
                """ % (json.dumps(schedule, cls=DateTimeEncoder), json.dumps(config, cls=DateTimeEncoder))))

        return stream
 def post_process_request(self, req, template, data, content_type):
     if (template, data) != (None, None) or \
             sys.exc_info() != (None, None, None):
         try:
             theme = self.system.theme
         except ThemeNotFound, e:
             add_warning(
                 req, "Unknown theme %s configured. Please check "
                 "your trac.ini. You may need to enable "
                 "the theme\'s plugin." % e.theme_name)
         else:
             if theme and 'css' in theme:
                 add_stylesheet(req, 'theme/' + theme['css'])
             if theme and 'template' in theme:
                 req.chrome['theme'] = os.path.basename(theme['template'])
             if theme and 'scripts' in theme:
                 for script_def in theme['scripts']:
                     if (isinstance(script_def, tuple)
                             and 1 <= len(script_def) <= 4):
                         add_script(req, *script_def)
                     else:
                         self.log.warning('Bad script def %s for theme %s',
                                          script_def, theme['name'])
             if theme and theme.get('disable_trac_css'):
                 links = req.chrome.get('links')
                 if links and 'stylesheet' in links:
                     for i, link in enumerate(links['stylesheet']):
                         if link.get('href', '') \
                                 .endswith('common/css/trac.css'):
                             del links['stylesheet'][i]
                             break
             if theme:
                 req.chrome['theme_info'] = theme
                 # Template overrides (since 2.2.0)
                 overrides = self._get_template_overrides(theme)
                 template, modifier = overrides.get(template,
                                                    (template, None))
                 if modifier is not None:
                     modifier(req, template, data, content_type)
         if self.custom_css:
             add_stylesheet(req, 'site/theme.css')
    def process_request(self, req):
        req.perm.require(self.BILLING_PERMISSION)
        messages = []

        def addMessage(s):
            messages.extend([s])

        if req.method == 'POST':
            if req.args.has_key('setbillingtime'):
                self.set_bill_date(req.authname, req.args.get('newbilltime'))
                addMessage("All tickets last bill date updated")

        mgr = CustomReportManager(self.env, self.log)
        data = {}
        data["statuses"] = get_statuses(self.env)
        data["reports"] = mgr.get_reports_by_group(
            CustomReportManager.TimingAndEstimationKey)
        # Handle pulling in report_descriptions
        # Could be added to custom report stuff, but that requires
        # coordinating with too many people for me to care right now
        report_descriptions = {}
        for h in reports.all_reports:
            report_descriptions[h["title"]] = h["description"]
        for key in data["reports"]:
            if report_descriptions.has_key(key):
                data["reports"][key]["description"] = report_descriptions[key]
        #self.log.debug("DEBUG got %s, %s" % (data["reports"], type(data["reports"])));
        data["billing_info"] = {
            "messages": messages,
            "href": req.href.billing(),
            "report_base_href": req.href.report(),
            "usermanual_href": req.href.wiki(user_manual_wiki_title),
            "usermanual_title": user_manual_title
        }

        self.set_request_billing_dates(data)

        add_stylesheet(req, "billing/billingplugin.css")
        add_script(req, "billing/date.js")
        add_script(req, "billing/linkifyer.js")
        return 'billing.html', data, None
Example #52
0
    def _diff_cr(self, req):
        add_stylesheet(req, 'common/css/diff.css')
        cs_id = req.args.get('id')
        old_version = req.args.get('old_version', 1)
        version = req.args.get('version', 1)
        db = self.env.get_db_cnx()
        cursor = db.cursor()
        try:
            version_author, version_status, newtext = self._get_version_record(
                cursor, cs_id, version)
            oldversion_author, oldversion_status, oldtext = self._get_version_record(
                cursor, cs_id, old_version)
        except ValueError:
            return pretty_err(req, 'Version Error')
        ctime = round(time.time(), 2)
        diff_style, diff_options = get_diff_options(req)
        context = 3
        for option in diff_options:
            if option.startswith('-U'):
                context = int(option[2:])
                break
        if context < 0:
            context = None
        changes = hdf_diff(oldtext.splitlines(),
                           newtext.splitlines(),
                           context=context,
                           ignore_blank_lines='-B' in diff_options,
                           ignore_case='-i' in diff_options,
                           ignore_space_changes='-b' in diff_options)
        req.hdf['version.diff'] = changes

        req.hdf['version_author'] = version_author
        req.hdf['oldversion_author'] = oldversion_author
        req.hdf['version_status'] = status_str[version_status]
        req.hdf['oldversion_status'] = status_str[oldversion_status]
        req.hdf['ctime'] = time.ctime(ctime)
        req.hdf['old_version'] = old_version
        req.hdf['version'] = version
        req.hdf['rev'] = cs_id
        req.hdf['update.href'] = self.env.href.CodeReview(cs_id, action='diff')
        return 'codereviewdiff.cs', None
    def process_request(self, req):
        ticket = model.Ticket(self.env, req.args.get('ticket'))
        data = {
            'ticket': ticket,
            'version': None,
            'split_string_error': None,
            'split_string_error_line_count': 0,
            'show_split_string_error': False,
            'split_string': ""
        }
        add_stylesheet(req, 'common/css/ticket.css')
        add_stylesheet(req, 'hw/css/addMultipleChildren.css')
        if req.method == 'POST':

            def _create_sub_tickets(self, string):
                sub_tickets = parseSubTicketString(string)
                for s in sub_tickets:
                    t = model.Ticket(self.env)
                    t['status'] = 'new'
                    t['summary'] = s.summary
                    t['description'] = s.description
                    t['parents'] = str(ticket.id)
                    t['reporter'] = get_reporter_id(req)
                    t['estimate'] = s.estimate
                    t['cl_product'] = ticket['cl_product']
                    t['type'] = 'task'
                    t.insert()

            split_string = req.args['addMultipleChildren']
            try:
                _create_sub_tickets(self, split_string)
                req.redirect(req.href.ticket(ticket.id))
            except SubTicketsStringError as error:
                data['split_string_error'] = error.message
                data['split_string_error_line_count'] = error.message.count(
                    '\n') + 2
                data['show_split_string_error'] = True
                data['split_string'] = split_string
        # This tuple is for Genshi (template_name, data, content_type)
        # Without data the trac layout will not appear.
        return 'addMultipleChildren.html', data, None
Example #54
0
    def process_request(self, req):
        from tractags.macros import TagMacros
        from tractags.parseargs import parseargs
        from trac.web.chrome import add_stylesheet

        add_stylesheet(req, 'tags/css/tractags.css')
        req.hdf['trac.href.tags'] = self.env.href.tags()

        def update_from_req(args):
            for k in req.args.keys():
                args[str(k)] = str(req.args.get(k))

        if re.match('^/tags/?$', req.path_info):
            index = self.env.config.get('tags', 'index', 'cloud')
            index_kwargs = {'smallest': 10, 'biggest': 30}
            _, config_kwargs = parseargs(self.env.config.get('tags', 'index.args', ''))
            index_kwargs.update(config_kwargs)
            update_from_req(index_kwargs)

            if index == 'cloud':
                req.hdf['tag.body'] = Markup(
                    TagMacros(self.env).render_tagcloud(req, **index_kwargs))
            elif index == 'list':
                req.hdf['tag.body'] = Markup(
                    TagMacros(self.env).render_listtagged(req, **index_kwargs))
            else:
                raise TracError("Invalid index style '%s'" % index)
        else:
            expression_space = self.env.config.getbool('tags', 'expression_space', 'false')
            _, args = parseargs(self.env.config.get('tags', 'listing.args', ''))
            if expression_space:
                req.hdf['tag.title'] = Markup('Objects matching the expression <i>%s</i>' % req.path_info[6:])
                args['expression'] = req.path_info[6:]
                tags = []
            else:
                req.hdf['tag.title'] = Markup('Objects tagged <i>%s</i>' % req.path_info[6:])
                tags = re.split('[,+]', req.path_info[6:])
            update_from_req(args)
            req.hdf['tag.body'] = Markup(
                TagMacros(self.env).render_listtagged(req, *tags, **args))
        return 'tags.cs', None
Example #55
0
    def process_request(self, req):
        req.perm.assert_permission('ROADMAP_VIEW')
        req.hdf['title'] = 'Roadmap'

        showall = req.args.get('show') == 'all'
        req.hdf['roadmap.showall'] = showall

        db = self.env.get_db_cnx()
        milestones = [
            milestone_to_hdf(self.env, db, req, m)
            for m in Milestone.select(self.env, showall, db)
        ]
        req.hdf['roadmap.milestones'] = milestones

        for idx, milestone in enumerate(milestones):
            milestone_name = unescape(milestone['name'])  # Kludge
            prefix = 'roadmap.milestones.%d.' % idx
            tickets = get_tickets_for_milestone(self.env, db, milestone_name,
                                                'owner')
            req.hdf[prefix + 'stats'] = calc_ticket_stats(tickets)
            for k, v in get_query_links(req, milestone_name).items():
                req.hdf[prefix + 'queries.' + k] = v
            milestone['tickets'] = tickets  # for the iCalendar view

        if req.args.get('format') == 'ics':
            self.render_ics(req, db, milestones)
            return

        add_stylesheet(req, 'common/css/roadmap.css')

        # FIXME should use the 'webcal:' scheme, probably
        username = None
        if req.authname and req.authname != 'anonymous':
            username = req.authname
        icshref = req.href.roadmap(show=req.args.get('show'),
                                   user=username,
                                   format='ics')
        add_link(req, 'alternate', icshref, 'iCalendar', 'text/calendar',
                 'ics')

        return 'roadmap.cs', None
Example #56
0
    def expand_macro(self, formatter, name, content):

        args, kw = parse_args(content)
        poll_frequency = args and args[0] or 60
        count = args and args[1] or 10

        if not (0 == len(args) or 2 == len(args)):
            return system_message(
                'Incorrect arguments: '
                'Must be of the format (poll frequency, lines to display)')

        add_stylesheet(formatter.req, 'irclogs/style.css')
        add_script(formatter.req, 'irclogs/jquery.timer.js')

        data = Chrome(self.env).populate_data(
            formatter.req, {
                'poll_frequency': int(poll_frequency) * 1000,
                'count': count
            })
        return Chrome(self.env).load_template('macro_live.html') \
                                    .generate(**data)
Example #57
0
 def render_admin_panel(self, req, cat, page, component):
     """
     Render the project properties Admin page
     """
     req.perm.assert_permission('TRAC_ADMIN')
     
     #Check if DB needs upgrading
     check_upgrade(self.env)
     
     if req.method == 'POST':
         if req.args.has_key('make'):
             data = self._do_createproject(req)
         if req.args.has_key('back'):
             req.redirect(req.href.admin(cat, page))
             return
     else:
         data = self._render_view(req)
 
     add_stylesheet(req, 'tracprojectmanager/css/projectproperties.css')
 
     return 'newproject.html', data
 def post_process_request(self, req, template, data, content_type):
   """Do any post-processing the request might need; typically adding
     values to the template `data` dictionary, or changing template or
     mime type.
     
     `data` may be update in place.
     
       Always returns a tuple of (template, data, content_type), even if
       unchanged.
       
       Note that `template`, `data`, `content_type` will be `None` if:
        - called when processing an error page
        - the default request handler did not return any result
       
       (Since Trac 0.11)
       """
   if self.is_active(req):
     # add_script( req, 'http://code.jquery.com/ui/1.10.3/jquery-ui.js' ) # load from CDN
     add_stylesheet( req, 'http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css')
     add_script( req, 'projectplan/js/ticketdatepicker.js' )
   return template, data, content_type
Example #59
0
    def render_admin_panel(self, req, cat, page, path_info):
        req.perm.assert_permission('TRAC_ADMIN')

        add_script(req, 'ticketext/ticketext.js')
        add_stylesheet(req, 'ticketext/ticketext.css')

        # localization
        locale = LocaleUtil().get_locale(req)
        if (locale == 'ja'):
            add_script(req, 'ticketext/ticketext-locale-ja.js')
            page_template = 'template_admin_ja.html'
        else:
            page_template = 'template_admin.html'

        if req.method == 'POST':
            self._process_update(req)

        page_param = {}
        self._process_read(req, page_param)

        return page_template, {'template': page_param}
Example #60
0
    def post_process_request(self, req, template, data, content_type):

        add_stylesheet(req, 'jqplotchart/jqplot/jquery.jqplot.min.css')
        add_stylesheet(req, 'jqplotchart/jqchart.css')

        add_script(req, 'jqplotchart/jqplot/excanvas.min.js')
        add_script(req, 'jqplotchart/jqplot/jquery.jqplot.min.js')

        plugin_base = 'jqplotchart/jqplot/plugins/jqplot.'
        add_script(req, plugin_base + 'highlighter.min.js')
        add_script(req, plugin_base + 'cursor.min.js')
        add_script(req, plugin_base + 'dateAxisRenderer.min.js')
        add_script(req, plugin_base + 'categoryAxisRenderer.min.js')
        add_script(req, plugin_base + 'pointLabels.min.js')
        add_script(req, plugin_base + 'pieRenderer.min.js')
        add_script(req, plugin_base + 'donutRenderer.min.js')
        add_script(req, plugin_base + 'barRenderer.min.js')
        add_script(req, plugin_base + 'meterGaugeRenderer.min.js')
        add_script(req, 'jqplotchart/jqchart.js')

        return (template, data, content_type)