Esempio n. 1
0
    def filter_events(self, events, user, project):
        """ Filter event list based on user's permissions
        """
        filtered_events = []
        policy = CQDEPermissionPolicy(self.env)
        permission_map = {
            'newticket': 'TICKET_VIEW',
            'closedticket': 'TICKET_VIEW',
            'reopenedticket': 'TICKET_VIEW',
            'changeset': 'CHANGESET_VIEW',
            'wiki': 'WIKI_VIEW',
            'attachment': 'ATTACHMENT_VIEW',
            'newmessage': 'DISCUSSION_VIEW',
            'newtopic': 'DISCUSSION_VIEW',
            'newforum': 'DISCUSSION_VIEW',
            'milestone': 'MILESTONE_VIEW'
        }

        for event in events:
            event_type = event[1]['kind']
            perm = permission_map.get(event_type)
            if perm and policy.check_permission(project.trac_environment_key,
                                                perm, user.username):
                filtered_events.append(event)

        return filtered_events
Esempio n. 2
0
 def __init__(self, verbose=False):
     """
     If verbose = None, be absolutely quiet
     """
     self.verbose = verbose
     self.policy = CQDEPermissionPolicy(MockEnvironment())
     self.papi = Projects()
     self.batch_size = conf.visibility_db_batch_size
     self.required_permission = 'PROJECT_VIEW'
Esempio n. 3
0
    def process_request(self, req):
        """
        Render welcome page
        """
        # Cast into bool directly, since match object properties are not needed
        viewing_user_profile = bool(RE_HOME_USER.match(req.path_info))
        userstore = get_userstore()

        if (req.authname == 'anonymous'
            and not self.env.config.getbool('multiproject', 'allow_public_projects')):
            conf.redirect(req, req.href('/user'))

        if viewing_user_profile:
            username = req.path_info.rsplit("/")[-1]
        else:
            username = req.authname

        user = userstore.getUser(username)
        if not user:
            raise TracError("User not found.")

        if req.authname == 'anonymous' and not viewing_user_profile:
            conf.redirect(req, conf.url_home_path + '/user')

        if user.username == 'anonymous' or user.username == 'authenticated':
            raise TracError("User not found.")

        # Possible values
        sort_cols = {'DATE': 5, 'PRIORITY': 6, 'PROJECT': 7}
        desc_asc = {'DESC': True, 'ASC': False}

        sort_tasks_by = req.args.get('sort_tasks_by','DATE')
        if sort_tasks_by not in sort_cols:
            sort_tasks_by = 'DATE'
        sort_col = sort_cols[sort_tasks_by]

        sort_options = {'DESC':'DESC', 'ASC':'ASC'}
        sort_tasks_order = sort_options.get(req.args.get('sort_tasks_order'), 'ASC')


        data = {}
        data['username'] = user.getDisplayName()
        if viewing_user_profile:
            if username != req.authname:
                # TODO: i18n support
                data['usernames'] = username + "'s"
            else:
                data['usernames'] = "Your"
        else:
            data['username'] = "******".format(user.givenName, user.lastName)
            data['usernames'] = "My"

        data['baseurl'] = conf.url_projects_path
        data['userpage'] = viewing_user_profile
        data['base_path'] = req.base_path

        # Prepare data for template
        prjs = Projects()

        default_projects, default_names = prjs.get_default_projects()
        data['default_projects'] = default_projects
        try:
            if viewing_user_profile:
                projects = prjs.get_participated_projects(user, by_ldap=False, public_only=True)
            else:
                projects = prjs.get_participated_projects(user, by_ldap=True, public_only=False)
        except TracError as e:
            projects = []

        if viewing_user_profile:
            all_projects = projects
        else:
            all_projects = default_projects + [p for p in projects if p.env_name not in default_names]

        admin_projects = []
        other_projects = []

        if viewing_user_profile:
            other_projects = all_projects
        else:
            for project in all_projects:
                if project.is_admin(user.username):
                    admin_projects.append(project)
                else:
                    other_projects.append(project)

        # admin_projects is [] in public profile or if there are not public, administrated projects
        data['projects_where_admin'] = admin_projects
        data['projects'] = other_projects

        # Get tickets and posts
        # [project, row[URL], row[SUMMARY], row[DESCRIPTION], row[PRIORITY], to_datetime(row[TIME]/1000000)]
        policy = CQDEPermissionPolicy(self.env)
        ticket_projects = []
        post_projects = []
        if viewing_user_profile:
            for project in all_projects:
                self.log.warning('project %s' % project.env_name)
                if policy.check_permission(project.env_name, 'TICKET_VIEW', 'anonymous'):
                    ticket_projects.append(project)
                if policy.check_permission(project.env_name, 'DISCUSSION_VIEW', 'anonymous'):
                    post_projects.append(project)
        else:
            ticket_projects = all_projects
            post_projects = all_projects

        tasks = prjs.get_all_user_tasks(user.username, ticket_projects)

        do_reverse = desc_asc[sort_tasks_order]
        tasks = sorted(tasks, key = lambda task: task[sort_col], reverse = do_reverse)

        # Get posts
        posts = self._get_posts(user.username, post_projects)

        data['tasks'] = tasks

        (totaltickets, totalclosed) = prjs.get_all_user_task_sums(user.username, all_projects)

        data['user'] = user
        data['known_priorities'] = ['blocker', 'critical', 'major', 'minor', 'trivial']
        data['sort_tasks_by'] = sort_tasks_by
        data['sort_tasks_order'] = sort_tasks_order
        data['posts'] = posts[:10]
        data['userpage'] = viewing_user_profile
        data['to_web_time'] = to_web_time

        # Check if user can create a project
        data['can_create_project'] = user.can_create_project()

        if viewing_user_profile:
            if username != req.authname:
                data['title'] = username + "'s profile"
                data['badgelinktitle'] = "View profile"
            else:
                data['title'] = "This is your public profile"
                data['badgelinktitle'] = "View your profile"
        else:
            data['title'] = "My projects"
            data['badgelinktitle'] = "View my public profile"

        topics_started = 0
        for post in posts:
            if post['topic_id'] == 0:
                topics_started += 1

        data['user'].details = {'Total tickets':totaltickets,
                                'Total tickets closed':totalclosed,
                                'Discussions started': topics_started}
        if not viewing_user_profile:
            data['watchlist'] = self._get_watchlist_events(user)

        return "myprojects.html", data, None