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
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
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
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
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
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())
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())
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
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
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)
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)
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)