Ejemplo n.º 1
0
    def new_project_form(self, req):
        req.perm.require("PROJECT_CREATE")
        author = get_context(req)['author']

        data = {}
        data['url'] = ProjectListModule.url
        data['vcslist'] = self._list_enabled_vcs()
        data['user'] = author
        data['prj_is_public'] = sanitize_html(req.args.get('prj_is_public'))

        return 'create_form.html', data, None
Ejemplo n.º 2
0
    def new_project_form(self, req):
        req.perm.require("PROJECT_CREATE")
        author = get_context(req)['author']

        data = {}
        data['url'] = ProjectListModule.url
        data['vcslist'] = self._list_enabled_vcs()
        data['user'] = author
        data['prj_is_public'] = sanitize_html(req.args.get('prj_is_public'))

        return 'create_form.html', data, None
Ejemplo n.º 3
0
    def _is_active_user(self, req):
        author = get_context(req)['author']

        # Try approving
        has_agreed_terms = req.args.has_key('agreeTerms') and req.args.get('agreeTerms') == 'on'
        if has_agreed_terms and (author.status == User.STATUS_INACTIVE):
            author.activate()

        # If user in active state, it's ok
        if author.status == User.STATUS_ACTIVE:
            return True
        return False
Ejemplo n.º 4
0
    def _is_active_user(self, req):
        author = get_context(req)['author']

        # Try approving
        has_agreed_terms = req.args.has_key('agreeTerms') and req.args.get(
            'agreeTerms') == 'on'
        if has_agreed_terms and (author.status == User.STATUS_INACTIVE):
            author.activate()

        # If user in active state, it's ok
        if author.status == User.STATUS_ACTIVE:
            return True
        return False
Ejemplo n.º 5
0
    def create_failure(self, req, msg):
        author = get_context(req)['author']

        data = {}
        data['url'] = ProjectListModule.url
        data['home'] = req.base_path
        data['user'] = author
        data['vcslist'] = self._list_enabled_vcs()
        data['prj_is_public'] = sanitize_html(req.args.get('prj_is_public', 'off'))

        # Use system warning to notify user
        add_warning(req, msg)

        for key in req.args:
            if key in ['prj_long_name', 'prj_short_name', 'prj_description',
                       'vcstype', '_project_']:
                data[key] = sanitize_html(req.args[key])

        return 'create_form.html', data, None
Ejemplo n.º 6
0
 def files_download_config(self, context_name='files', req=None):
     """
     :param str context_name: either 'files' or 'webdav'
     :return: FilesDownloadConfig
     """
     ctx = None
     ctx_key = 'files.download_config.' + context_name
     if req:
         ctx = get_context(req)
         try:
             return ctx[ctx_key]
         except KeyError:
             pass
     env_name = self.env.project_identifier
     base_url = self.base_url(context_name=context_name)
     download_config = FilesDownloadConfig(env_name, base_url=base_url)
     if ctx:
         ctx[ctx_key] = download_config
     return download_config
Ejemplo n.º 7
0
    def process_request(self, req):
        """ Process request for listing, creating and removing projects
        """
        users = get_userstore()
        ctx = get_context(req)
        author = ctx['author'] = users.getUser(req.authname)

        if req.authname == 'anonymous':
            conf.redirect(req)

        # TODO: are recent_public and active_public lists really needed?
        actions = {
            "new": self.new_project_form,
            "create": self.create_project,
            "remove": self.remove_project,
            "forkables": self._list_forkable_projects,
            "recent_public": self._list_recent_public_projects,
            "active_public": self._list_mostactive_public_projects
        }

        # Default action
        action = 'list'

        # Try if other action is given
        try:
            act = str(req.path_info.rsplit('/', 1)[1])

            if act in actions:
                action = act
        except:
            self.log.debug(
                "ProjectListModule.process_request failed splitting action.")

        if action in self.project_listings:
            explore_comp = self.env[FindProjectsModule]
            if not explore_comp.has_explore_perm(req):
                req.redirect(conf.url_home_path)

        # Run requested action
        if actions.has_key(action):
            return actions[action](req)

        req.redirect(ProjectListModule.home())
Ejemplo n.º 8
0
    def process_request(self, req):
        """ Process request for listing, creating and removing projects
        """
        users = get_userstore()
        ctx = get_context(req)
        author = ctx['author'] = users.getUser(req.authname)

        if req.authname == 'anonymous':
            conf.redirect(req)

        # TODO: are recent_public and active_public lists really needed?
        actions = {
            "new": self.new_project_form,
            "create": self.create_project,
            "remove": self.remove_project,
            "forkables": self._list_forkable_projects,
            "recent_public": self._list_recent_public_projects,
            "active_public": self._list_mostactive_public_projects
        }

        # Default action
        action = 'list'

        # Try if other action is given
        try:
            act = str(req.path_info.rsplit('/', 1)[1])

            if act in actions:
                action = act
        except:
            self.log.debug("ProjectListModule.process_request failed splitting action.")

        if action in self.project_listings:
            explore_comp = self.env[FindProjectsModule]
            if not explore_comp.has_explore_perm(req):
                req.redirect(conf.url_home_path)

        # Run requested action
        if actions.has_key(action):
            return actions[action](req)

        req.redirect(ProjectListModule.home())
Ejemplo n.º 9
0
 def files_node_factory_and_config(self, req=None, context_name='files'):
     """
     :param req: Request object
     :param str context_name: either 'files' or 'webdav'
     :return:
     """
     ctx = None
     ctx_key = 'files.node_factory.' + context_name
     if req:
         ctx = get_context(req)
         try:
             return ctx[ctx_key], self.files_download_config(context_name, req=req)
         except KeyError:
             pass
     download_config = self.files_download_config(context_name=context_name, req=req)
     project = Project.get(self.env)
     project_id = project.id
     node_factory = MappedFileNode(project_id,
         download_config.base_path, download_config.base_url, download_config.downloads_dir)
     if ctx:
         ctx[ctx_key] = node_factory
     return node_factory, download_config
Ejemplo n.º 10
0
    def create_failure(self, req, msg):
        author = get_context(req)['author']

        data = {}
        data['url'] = ProjectListModule.url
        data['home'] = req.base_path
        data['user'] = author
        data['vcslist'] = self._list_enabled_vcs()
        data['prj_is_public'] = sanitize_html(
            req.args.get('prj_is_public', 'off'))

        # Use system warning to notify user
        add_warning(req, msg)

        for key in req.args:
            if key in [
                    'prj_long_name', 'prj_short_name', 'prj_description',
                    'vcstype', '_project_'
            ]:
                data[key] = sanitize_html(req.args[key])

        return 'create_form.html', data, None
Ejemplo n.º 11
0
    def create_project(self, req):
        """ Handler for creating project request
        """
        req.perm.require("PROJECT_CREATE")
        if req.method != 'POST':
            return self.create_failure(req, 'POST request needed when creating a new project')
        author = get_context(req)['author']
        # If agreement needed but not getting it, show failure
        if conf.project_requires_agreed_terms and not self._is_active_user(req):
            return self.create_failure(req, 'You need to approve legal text to create a project!')

        # Read and transform some variables
        vcs_type = req.args.get('vcstype')
        vcs_name = req.args.get('vcs_name')
        if not self.validate_repository_name(vcs_name):
            return self.create_failure(req, 'Check repository name.')

        parent_project = None
        if "_project_" in req.args:
            parent_project = Project.get(env_name=req.args.get('_project_'))
            self.__require_permissions_for_cloning(req.authname, parent_project)
            vcs_type = conf.getVersionControlType(parent_project.env_name) # TODO: expensive call, probably needed

        # Read settings
        settings = {}
        if vcs_type:
            settings['vcs_type'] = vcs_type
        if vcs_name:
            settings['vcs_name'] = vcs_name

        identifier = req.args.get('prj_short_name')
        name = req.args.get('prj_long_name')
        project_visibility = 'prj_is_public' in req.args

        public = False
        published = None
        if project_visibility:
            public = True
            published = datetime.now()

        # Create project object
        project = Project(
            id = None,
            env_name = identifier,
            project_name = name,
            description = req.args.get('prj_description'),
            author_id = author.id,
            created = None, # Use default which is now()
            public = public,
            published = published
        )

        # Create project environment
        projects = Projects()
        try:
            projects.create_project(project, settings)
        except ProjectValidationException as exc:
            self.log.warning('Project creation failed due the validation: {0}'.format(exc.value))
            return self.create_failure(req, exc.value)
        except:
            self.log.exception('Project creation failed')
            return self.create_failure(req, _("Creating project failed. Try again later."))

        if public:
            projects.add_public_project_visibility(project.id)

        #Add author to follow project
        watch_store = CQDEWatchlistStore()
        watch_store.watch_project(author.id, project.id)

        #Change project trac.ini to support multiple repositories
        project_env_path = conf.getEnvironmentSysPath(project.env_name)
        repo_env_path = conf.getEnvironmentVcsPath(project.env_name, vcs_type, vcs_name)
        os.rename(project_env_path + '/conf/trac.ini', project_env_path + '/conf/trac.ini.bak')
        oldfile = open(project_env_path + '/conf/trac.ini.bak', 'r')
        newfile = open(project_env_path + '/conf/trac.ini', 'w')
        lines = oldfile.readlines()
        for line in lines:
            newfile.write(line)
            if line.startswith('database ='):
                break
        newfile.write('repository_dir =\nrepository_type = svn\n\n[repositories]\n')
        newfile.write('%s.dir = %s\n' % (vcs_name, repo_env_path))
        newfile.write('%s.type = %s\n' % (vcs_name, vcs_type))
        newfile.close()
        oldfile.close()
        os.remove(project_env_path + '/conf/trac.ini.bak')

        # Notify listeners. The project object still exists, but database does not
        for listener in self.project_change_listeners:
            try:
                listener.project_created(project)
                listener.project_watchers(project)
                if public:
                    listener.project_set_public(project)
            except:
                pass


        return self.create_success(req, project)
Ejemplo n.º 12
0
    def create_project(self, req):
        """ Handler for creating project request
        """
        req.perm.require("PROJECT_CREATE")
        if req.method != 'POST':
            return self.create_failure(req, 'POST request needed when creating a new project')

        author = get_context(req)['author']

        # If agreement needed but not getting it, show failure
        if conf.project_requires_agreed_terms and not self._is_active_user(req):
            return self.create_failure(req, 'You need to approve legal text to create a project!')

        # Read and transform some variables
        vcs_type = req.args.get('vcstype')
        parent_project = None
        if "_project_" in req.args:
            parent_project = Project.get(env_name=req.args.get('_project_'))
            self.__require_permissions_for_cloning(req.authname, parent_project)
            vcs_type = conf.getVersionControlType(parent_project.env_name) # TODO: expensive call, probably needed

        # Read settings
        settings = {}
        if vcs_type:
            settings['vcs_type'] = vcs_type

        identifier = req.args.get('prj_short_name')
        name = req.args.get('prj_long_name')
        public = 'prj_is_public' in req.args

        published = None
        if public:
            published = datetime.now()

        # Create project object
        project = Project(
            id = None,
            env_name = identifier,
            project_name = name,
            description = req.args.get('prj_description'),
            author_id = author.id,
            created = None, # Use default which is now()
            published = published
        )

        # Create project environment
        projects = Projects()
        try:
            projects.create_project(project, settings)
        except ProjectValidationException as exc:
            self.log.warning('Project creation failed due the validation: {0}'.format(exc.value))
            return self.create_failure(req, exc.value)
        except:
            self.log.exception('Project creation failed')
            return self.create_failure(req, _("Creating project failed. Try again later."))

        if public:
            projects.add_public_project_visibility(project.id)

        # Notify listeners. The project object still exists, but database does not
        for listener in self.project_change_listeners:
            listener.project_created(project)
            if public:
                listener.project_set_public(project)

        return self.create_success(req, project)
Ejemplo n.º 13
0
    def create_project(self, req):
        """ Handler for creating project request
        """
        req.perm.require("PROJECT_CREATE")
        if req.method != 'POST':
            return self.create_failure(
                req, 'POST request needed when creating a new project')
        author = get_context(req)['author']
        # If agreement needed but not getting it, show failure
        if conf.project_requires_agreed_terms and not self._is_active_user(
                req):
            return self.create_failure(
                req, 'You need to approve legal text to create a project!')

        # Read and transform some variables
        vcs_type = req.args.get('vcstype')
        vcs_name = req.args.get('vcs_name')
        if not self.validate_repository_name(vcs_name):
            return self.create_failure(req, 'Check repository name.')

        parent_project = None
        if "_project_" in req.args:
            parent_project = Project.get(env_name=req.args.get('_project_'))
            self.__require_permissions_for_cloning(req.authname,
                                                   parent_project)
            vcs_type = conf.getVersionControlType(
                parent_project.env_name
            )  # TODO: expensive call, probably needed

        # Read settings
        settings = {}
        if vcs_type:
            settings['vcs_type'] = vcs_type
        if vcs_name:
            settings['vcs_name'] = vcs_name

        identifier = req.args.get('prj_short_name')
        name = req.args.get('prj_long_name')
        project_visibility = 'prj_is_public' in req.args

        public = False
        published = None
        if project_visibility:
            public = True
            published = datetime.now()

        # Create project object
        project = Project(
            id=None,
            env_name=identifier,
            project_name=name,
            description=req.args.get('prj_description'),
            author_id=author.id,
            created=None,  # Use default which is now()
            public=public,
            published=published)

        # Create project environment
        projects = Projects()
        try:
            projects.create_project(project, settings)
        except ProjectValidationException as exc:
            self.log.warning(
                'Project creation failed due the validation: {0}'.format(
                    exc.value))
            return self.create_failure(req, exc.value)
        except:
            self.log.exception('Project creation failed')
            return self.create_failure(
                req, _("Creating project failed. Try again later."))

        if public:
            projects.add_public_project_visibility(project.id)

        #Add author to follow project
        watch_store = CQDEWatchlistStore()
        watch_store.watch_project(author.id, project.id)

        #Change project trac.ini to support multiple repositories
        project_env_path = conf.getEnvironmentSysPath(project.env_name)
        repo_env_path = conf.getEnvironmentVcsPath(project.env_name, vcs_type,
                                                   vcs_name)
        os.rename(project_env_path + '/conf/trac.ini',
                  project_env_path + '/conf/trac.ini.bak')
        oldfile = open(project_env_path + '/conf/trac.ini.bak', 'r')
        newfile = open(project_env_path + '/conf/trac.ini', 'w')
        lines = oldfile.readlines()
        for line in lines:
            newfile.write(line)
            if line.startswith('database ='):
                break
        newfile.write(
            'repository_dir =\nrepository_type = svn\n\n[repositories]\n')
        newfile.write('%s.dir = %s\n' % (vcs_name, repo_env_path))
        newfile.write('%s.type = %s\n' % (vcs_name, vcs_type))
        newfile.close()
        oldfile.close()
        os.remove(project_env_path + '/conf/trac.ini.bak')

        # Notify listeners. The project object still exists, but database does not
        for listener in self.project_change_listeners:
            try:
                listener.project_created(project)
                listener.project_watchers(project)
                if public:
                    listener.project_set_public(project)
            except:
                pass

        return self.create_success(req, project)