def test_ticket_move_with_users_not_in_project(self): app1 = c.project.app_instance('bugs') app2 = c.project.app_instance('bugs2') app1.globals.custom_fields.extend([ {'name': '_user_field', 'type': 'user', 'label': 'User field'}, {'name': '_user_field_2', 'type': 'user', 'label': 'User field 2'}]) app2.globals.custom_fields.extend([ {'name': '_user_field', 'type': 'user', 'label': 'User field'}, {'name': '_user_field_2', 'type': 'user', 'label': 'User field 2'}]) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all() from allura.websetup import bootstrap bootstrap.create_user('test-user-0') with h.push_context(c.project._id, app_config_id=app1.config._id): ticket = Ticket.new() ticket.summary = 'test ticket' ticket.description = 'test description' ticket.custom_fields['_user_field'] = 'test-user' # in project ticket.custom_fields['_user_field_2'] = 'test-user-0' # not in project ticket.assigned_to_id = User.by_username('test-user-0')._id # not in project t = ticket.move(app2.config) assert_equal(t.assigned_to_id, None) assert_equal(t.custom_fields['_user_field'], 'test-user') assert_equal(t.custom_fields['_user_field_2'], '') post = Post.query.find(dict(thread_id=ticket.discussion_thread._id)).first() assert post is not None, 'No comment about ticket moving' message = 'Ticket moved from /p/test/bugs/1/' message += '\n\nCan\'t be converted:\n' message += '\n- **_user_field_2**: test-user-0 (user not in project)' message += '\n- **assigned_to**: test-user-0 (user not in project)' assert_equal(post.text, message)
def test_milestone_rename(self): self.new_ticket(summary='test milestone rename') self.app.post('/bugs/1/update_ticket',{ 'summary':'test milestone rename', 'description':'', 'status':'', '_milestone':'1.0', 'assigned_to':'', 'labels':'', 'labels_old':'', 'comment': '' }) ThreadLocalORMSession.flush_all() M.MonQTask.run_ready() ThreadLocalORMSession.flush_all() ticket_view = self.app.get('/p/test/bugs/1/') assert 'Milestone' in ticket_view assert '1.0' in ticket_view assert 'zzzé' not in ticket_view r = self.app.post('/bugs/update_milestones',{ 'field_name':'_milestone', 'milestones-0.old_name':'1.0', 'milestones-0.new_name':'zzzé', 'milestones-0.description':'', 'milestones-0.complete':'Open', 'milestones-0.due_date':'' }) ticket_view = self.app.get('/p/test/bugs/1/') assert '1.0' not in ticket_view assert 'zzzé' in ticket_view
def install(self, project): """Create repo object for this tool""" super(ForgeGitApp, self).install(project) repo = GM.Repository(name=self.config.options.mount_point + ".git", tool="git", status="initializing") ThreadLocalORMSession.flush_all() cloned_from_project_id = self.config.options.get("cloned_from_project_id") cloned_from_repo_id = self.config.options.get("cloned_from_repo_id") init_from_url = self.config.options.get("init_from_url") init_from_path = self.config.options.get("init_from_path") if cloned_from_project_id is not None: cloned_from = GM.Repository.query.get(_id=cloned_from_repo_id) allura.tasks.repo_tasks.clone.post( cloned_from_path=cloned_from.full_fs_path, cloned_from_name=cloned_from.app.config.script_name(), cloned_from_url=cloned_from.full_fs_path, copy_hooks=self.config.options.get("copy_hooks", False), ) elif init_from_url or init_from_path: allura.tasks.repo_tasks.clone.post( cloned_from_path=init_from_path, cloned_from_name=None, cloned_from_url=init_from_url, copy_hooks=self.config.options.get("copy_hooks", False), ) else: allura.tasks.repo_tasks.init.post()
def test_interactive(self, Request, Server): M.OAuthConsumerToken.consumer = mock.Mock() user = M.User.by_username('test-admin') consumer_token = M.OAuthConsumerToken( api_key='api_key', user_id=user._id, description='ctok_desc', ) ThreadLocalORMSession.flush_all() req = Request.from_request.return_value = { 'oauth_consumer_key': 'api_key', 'oauth_callback': 'http://my.domain.com/callback', } r = self.app.post('/rest/oauth/request_token', params={}) rtok = parse_qs(r.body)['oauth_token'][0] r = self.app.post('/rest/oauth/authorize', params={'oauth_token': rtok}) r = r.forms[0].submit('yes') assert r.location.startswith('http://my.domain.com/callback') pin = parse_qs(urlparse(r.location).query)['oauth_verifier'][0] #pin = r.html.find(text=re.compile('^PIN: ')).split()[1] req = Request.from_request.return_value = { 'oauth_consumer_key': 'api_key', 'oauth_token': rtok, 'oauth_verifier': pin, } r = self.app.get('/rest/oauth/access_token') atok = parse_qs(r.body) assert_equal(len(atok['oauth_token']), 1) assert_equal(len(atok['oauth_token_secret']), 1)
def test_prefs(self): r = self.app.get('/auth/preferences/', extra_environ=dict(username='******')) assert '*****@*****.**' not in r r = self.app.post('/auth/preferences/update', params={ 'preferences.display_name':'Test Admin', 'new_addr.addr':'*****@*****.**', 'new_addr.claim':'Claim Address', 'primary_addr':'*****@*****.**', 'preferences.email_format':'plain'}, extra_environ=dict(username='******')) r = self.app.get('/auth/preferences/') assert '*****@*****.**' in r r = self.app.post('/auth/preferences/update', params={ 'preferences.display_name':'Test Admin', 'addr-1.ord':'1', 'addr-2.ord':'1', 'addr-2.delete':'on', 'new_addr.addr':'', 'primary_addr':'*****@*****.**', 'preferences.email_format':'plain'}, extra_environ=dict(username='******')) r = self.app.get('/auth/preferences/') assert '*****@*****.**' not in r ea = M.EmailAddress.query.get(_id='*****@*****.**') ea.confirmed = True ThreadLocalORMSession.flush_all() r = self.app.post('/auth/preferences/update', params={ 'preferences.display_name':'Test Admin', 'new_addr.addr':'*****@*****.**', 'new_addr.claim':'Claim Address', 'primary_addr':'*****@*****.**', 'preferences.email_format':'plain'}, extra_environ=dict(username='******'))
def install(self, project): '''Create repo object for this tool''' super(ForgeHgApp, self).install(project) HM.Repository( name=self.config.options.mount_point, tool='hg', status='initializing') ThreadLocalORMSession.flush_all() cloned_from_project_id = self.config.options.get('cloned_from_project_id') cloned_from_repo_id = self.config.options.get('cloned_from_repo_id') init_from_url = self.config.options.get('init_from_url') init_from_path = self.config.options.get('init_from_path') if cloned_from_project_id is not None: cloned_from = HM.Repository.query.get(_id=cloned_from_repo_id) allura.tasks.repo_tasks.clone.post( cloned_from_path=cloned_from.full_fs_path, cloned_from_name=cloned_from.app.config.script_name(), cloned_from_url=cloned_from.full_fs_path, copy_hooks=self.config.options.get('copy_hooks', False)) elif init_from_url or init_from_path: allura.tasks.repo_tasks.clone.post( cloned_from_path=init_from_path, cloned_from_name=None, cloned_from_url=init_from_url, copy_hooks=self.config.options.get('copy_hooks', False)) else: allura.tasks.repo_tasks.init.post()
def test_that_label_counts_are_local_to_tool(self): """Test that label queries return only artifacts from the specified tool. """ # create a ticket in two different tools, with the same label from allura.tests import decorators as td @td.with_tool('test', 'Tickets', 'bugs', username='******') def _test_ticket(): return Ticket(ticket_num=1, summary="ticket1", labels=["mylabel"]) @td.with_tool('test', 'Tickets', 'bugs2', username='******') def _test_ticket2(): return Ticket(ticket_num=2, summary="ticket2", labels=["mylabel"]) # create and save the tickets t1 = _test_ticket() t2 = _test_ticket2() ThreadLocalORMSession.flush_all() # test label query results label_count1 = t1.artifacts_labeled_with( "mylabel", t1.app_config).count() label_count2 = t2.artifacts_labeled_with( "mylabel", t2.app_config).count() assert 1 == label_count1 == label_count2
def test_disable_user(self): user = Mock(disabled=False, __ming__=Mock(), is_anonymous=lambda: False, _id=ObjectId()) c.user = Mock(username='******') with audits('Account disabled', user=True, actor='test-admin'): self.provider.disable_user(user) ThreadLocalORMSession.flush_all() assert_equal(user.disabled, True)
def make_artifact(self, ticket_dict): remapped = {} for f, v in ticket_dict.iteritems(): transform = self.FIELD_MAP.get(f, ()) if transform is None: continue elif transform is True: remapped[f] = v elif callable(transform): transform(remapped, f, v) elif transform is (): self.custom(remapped, f, v) else: new_f, conv = transform remapped[new_f] = conv(v) ticket_num = ticket_dict['id'] existing_ticket = TM.Ticket.query.get(app_config_id=c.app.config._id, ticket_num=ticket_num) if existing_ticket: ticket_num = c.app.globals.next_ticket_num() self.warnings.append('Ticket #%s: Ticket with this id already exists, using next available id: %s' % (ticket_dict['id'], ticket_num)) else: if c.app.globals.last_ticket_num < ticket_num: c.app.globals.last_ticket_num = ticket_num ThreadLocalORMSession.flush_all() ticket = TM.Ticket( app_config_id=c.app.config._id, custom_fields=dict(), ticket_num=ticket_num, import_id=c.api_token.api_key) ticket.update(remapped) return ticket
def test_user(): assert c.user.url() .endswith('/u/test-admin/') assert c.user.script_name .endswith('/u/test-admin/') assert_equal(set(p.shortname for p in c.user.my_projects()), set(['test', 'test2', 'u/test-admin', 'adobe-1', '--init--'])) # delete one of the projects and make sure it won't appear in my_projects() p = M.Project.query.get(shortname='test2') p.deleted = True ThreadLocalORMSession.flush_all() assert_equal(set(p.shortname for p in c.user.my_projects()), set(['test', 'u/test-admin', 'adobe-1', '--init--'])) u = M.User.register(dict( username='******')) ThreadLocalORMSession.flush_all() assert_equal(u.private_project().shortname, 'u/nosetest-user') roles = g.credentials.user_roles( u._id, project_id=u.private_project().root_project._id) assert len(roles) == 3, roles u.set_password('foo') provider = plugin.LocalAuthenticationProvider(Request.blank('/')) assert provider._validate_password(u, 'foo') assert not provider._validate_password(u, 'foobar') u.set_password('foobar') assert provider._validate_password(u, 'foobar') assert not provider._validate_password(u, 'foo')
def test_user_project_does_not_create_on_demand_for_openid_user(): u = M.User.register({'username': ''}, make_project=False) ThreadLocalORMSession.flush_all() assert not u.private_project() assert not M.Project.query.get(shortname='u/') assert not M.Project.query.get(shortname='u/anonymous') assert not M.Project.query.get(shortname='u/*anonymous')
def test_artifactlink(): pg = WM.Page(title='TestPage2') q = M.Shortlink.query.find(dict( project_id=c.project._id, app_config_id=c.app.config._id, link=pg.shorthand_id())) assert q.count() == 0 ThreadLocalORMSession.flush_all() M.MonQTask.run_ready() ThreadLocalORMSession.flush_all() assert q.count() == 1 assert M.Shortlink.lookup('[TestPage2]') assert M.Shortlink.lookup('[wiki:TestPage2]') assert M.Shortlink.lookup('[test:wiki:TestPage2]') assert not M.Shortlink.lookup('[test:wiki:TestPage2:foo]') assert not M.Shortlink.lookup('[Wiki:TestPage2]') assert not M.Shortlink.lookup('[TestPage2_no_such_page]') c.project.uninstall_app('wiki') ThreadLocalORMSession.flush_all() assert not M.Shortlink.lookup('[wiki:TestPage2]') pg.delete() ThreadLocalORMSession.flush_all() M.MonQTask.run_ready() ThreadLocalORMSession.flush_all() assert q.count() == 0
def install(self, project): '''Create repo object for this tool''' super(ForgeGitApp, self).install(project) repo = GM.Repository( name=self.config.options.mount_point + '.git', tool='git', status='initializing', fs_path=self.config.options.get('fs_path')) ThreadLocalORMSession.flush_all() cloned_from_project_id = self.config.options.get('cloned_from_project_id') cloned_from_repo_id = self.config.options.get('cloned_from_repo_id') init_from_url = self.config.options.get('init_from_url') init_from_path = self.config.options.get('init_from_path') if cloned_from_project_id is not None: cloned_from = GM.Repository.query.get(_id=cloned_from_repo_id) repo.default_branch_name = cloned_from.default_branch_name repo.additional_viewable_extensions = cloned_from.additional_viewable_extensions allura.tasks.repo_tasks.clone.post( cloned_from_path=cloned_from.full_fs_path, cloned_from_name=cloned_from.app.config.script_name(), cloned_from_url=cloned_from.full_fs_path) elif init_from_url or init_from_path: allura.tasks.repo_tasks.clone.post( cloned_from_path=init_from_path, cloned_from_name=None, cloned_from_url=init_from_url) else: allura.tasks.repo_tasks.init.post()
def private_project(self): ''' Returns the personal user-project for the user ''' if self.disabled or self.pending: return None from allura import model as M n = self.neighborhood auth_provider = plugin.AuthenticationProvider.get(request) project_shortname = auth_provider.user_project_shortname(self) p = M.Project.query.get( shortname=project_shortname, neighborhood_id=n._id) if p and p.deleted: # really delete it, since registering a new project would conflict # with the "deleted" one log.info( 'completely deleting user project (was already flagged as deleted) %s', project_shortname) p.delete() ThreadLocalORMSession.flush_all() p = None if not p and not self.is_anonymous(): # create user-project on demand if it is missing p = n.register_project( project_shortname, user=self, user_project=True) return p
def test_ticket_move_with_different_custom_fields(self): app1 = c.project.app_instance('bugs') app2 = c.project.app_instance('bugs2') app1.globals.custom_fields.extend([ {'name': '_test', 'type': 'string', 'label': 'Test field'}, {'name': '_test2', 'type': 'string', 'label': 'Test field 2'}]) app2.globals.custom_fields.append( {'name': '_test', 'type': 'string', 'label': 'Test field'}) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all() with h.push_context(c.project._id, app_config_id=app1.config._id): ticket = Ticket.new() ticket.summary = 'test ticket' ticket.description = 'test description' ticket.custom_fields['_test'] = 'test val' ticket.custom_fields['_test2'] = 'test val 2' t = ticket.move(app2.config) assert_equal(t.summary, 'test ticket') assert_equal(t.description, 'test description') assert_equal(t.custom_fields['_test'], 'test val') post = Post.query.find(dict(thread_id=ticket.discussion_thread._id)).first() assert post is not None, 'No comment about ticket moving' message = 'Ticket moved from /p/test/bugs/1/' message += '\n\nCan\'t be converted:\n' message += '\n- **_test2**: test val 2' assert_equal(post.text, message)
def main(): test = sys.argv[-1] == 'test' num_projects_examined = 0 log.info('Examining subroles in all non-user projects.') n_users = M.Neighborhood.query.get(name='Users') project_filter = dict(neighborhood_id={'$ne': n_users._id}) for some_projects in utils.chunked_find(M.Project, project_filter): for project in some_projects: project_name = '%s.%s' % ( project.neighborhood.name, project.shortname) project_roles = {} for parent, child in [('Admin', 'Developer'), ('Developer', 'Member')]: parent_role = M.ProjectRole.by_name(parent, project=project) child_role = M.ProjectRole.by_name(child, project=project) project_roles[parent] = parent_role project_roles[child] = child_role if not (parent_role and child_role): break if len(parent_role.roles) != 1 or parent_role.roles[0] != child_role._id: if test: log.info('Would reset %s subroles for project "%s".' % (parent, project_name)) log.info('- Existing %s subrole(s): %s' % (parent, parent_role.roles)) else: log.info('Resetting %s subroles for project "%s".' % (parent, project_name)) parent_role.roles = [child_role._id] ThreadLocalORMSession.flush_all() if not (project_roles['Admin'] and project_roles['Developer'] and project_roles['Member']): log.info( 'Skipping "%s": missing Admin, Developer, or Member roles' % project_name) continue for user in project.users(): pr = user.project_role(project=project) if not pr.roles: continue for parent, children in [('Admin', ('Developer', 'Member')), ('Developer', ('Member',))]: if project_roles[parent]._id not in pr.roles: continue for role_name in children: extra_role = project_roles[role_name] if extra_role._id in pr.roles: if test: log.info('Would remove %s role from user "%s" in project "%s" (already has %s role).' % (role_name, user.username, project_name, parent)) pr.roles.remove(extra_role._id) else: log.info('Removing %s role from user "%s" in project "%s" (already has %s role).' % (role_name, user.username, project_name, parent)) pr.roles.remove(extra_role._id) ThreadLocalORMSession.flush_all() num_projects_examined += 1 session(project).clear() log.info('%s projects examined.' % num_projects_examined)
def command(self): self.basic_setup() self.hostname = socket.gethostname() self.taskd_status_log = self.args[1] self.stuck_pids = [] self.error_tasks = [] self.suspicious_tasks = [] taskd_pids = self._taskd_pids() base.log.info('Taskd processes on %s: %s' % (self.hostname, taskd_pids)) # find stuck taskd processes base.log.info('Seeking for stuck taskd processes') for pid in taskd_pids: base.log.info('...sending USR1 to %s and watching status log' % (pid)) status = self._check_taskd_status(int(pid)) if status != 'OK': base.log.info('...taskd pid %s has stuck' % pid) self.stuck_pids.append(pid) if self.options.kill: base.log.info('...-k is set. Killing %s' % pid) self._kill_stuck_taskd(pid) else: base.log.info('...%s' % status) # find 'forsaken' tasks base.log.info('Seeking for forsaken busy tasks') tasks = [t for t in self._busy_tasks() if t not in self.error_tasks] # skip seen tasks base.log.info('Found %s busy tasks on %s' % (len(tasks), self.hostname)) for task in tasks: base.log.info('Verifying task %s' % task) pid = task.process.split()[-1] if pid not in taskd_pids: # 'forsaken' task base.log.info('Task is forsaken ' '(can\'t find taskd with given pid). ' 'Setting state to \'error\'') task.state = 'error' task.result = 'Can\'t find taskd with given pid' self.error_tasks.append(task) else: # check if taskd with given pid really processing this task now: base.log.info('Checking that taskd pid %s is really processing task %s' % (pid, task._id)) status = self._check_task(pid, task) if status != 'OK': # maybe task moved quickly and now is complete # so we need to check such tasks later # and mark incomplete ones as 'error' self.suspicious_tasks.append(task) base.log.info('...NO. Adding task to suspisious list') else: base.log.info('...OK') # check suspicious task and mark incomplete as error base.log.info('Checking suspicious list for incomplete tasks') self._check_suspicious_tasks() ThreadLocalORMSession.flush_all() self.print_summary()
def test_pull_rss_feeds(parsefeed): html_content = ( "<p>1. foo</p>\n" "\n" "<p>\n" "#foo bar <a href='baz'>baz</a>\n" "foo bar\n" "</p>\n" "\n" "<p>#foo bar <a href='baz'>\n" "baz\n" "</a></p>\n" ) rendered_html_content = "\n".join([ r"1\. foo", "", r"\#foo bar [baz](baz) foo bar ", "", r"\#foo bar [ baz ](baz)", " [link](http://example.com/)", ]) parsefeed.return_value = _mock_feed( dict(title='Test', subtitle='test', summary='This is a test'), dict(content_type='text/plain', content='Test feed'), dict(content_type='text/html', content=html_content), dict(summary_detail=dict(type='text/html', value=html_content)), ) base_app = M.AppConfig.query.find().all()[0] tmp_app = M.AppConfig( tool_name=u'Blog', discussion_id=base_app.discussion_id, project_id=base_app.project_id, options={u'ordinal': 0, u'show_right_bar': True, u'project_name': base_app.project.name, u'mount_point': u'blog', u'mount_label': u'Blog'}) new_external_feeds = ['http://example.com/news/feed/'] BM.Globals(app_config_id=tmp_app._id, external_feeds=new_external_feeds) ThreadLocalORMSession.flush_all() from forgeblog.command import rssfeeds cmd = rssfeeds.RssFeedsCommand('pull-rss-feeds') cmd.run([test_config, '-a', tmp_app._id]) cmd.command() parsefeed.assert_called_with('http://example.com/news/feed/') posts = BM.BlogPost.query.find( {'app_config_id': tmp_app._id}).sort('timestamp', 1) assert_equal(posts.count(), 4) posts = posts.all() assert_equal(posts[0].title, 'Test') assert_equal(posts[0].text, 'This is a test [link](http://example.com/)') assert_equal(posts[1].title, 'Default Title 2') assert_equal(posts[1].text, 'Test feed [link](http://example.com/)') assert_equal(posts[2].title, 'Default Title 3') assert_equal(posts[2].text, rendered_html_content) assert_equal(posts[3].title, 'Default Title 4') assert_equal(posts[3].text, rendered_html_content)
def main(): M.TroveCategory(trove_cat_id=670, trove_parent_id=14, shortname="agpl", fullname="Affero GNU Public License", fullpath="License :: OSI-Approved Open Source :: Affero GNU Public License") ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all()
def test_admin_stats_del_count(self): neighborhood = M.Neighborhood.query.get(name='Adobe') proj = M.Project.query.get(neighborhood_id=neighborhood._id) proj.deleted = True ThreadLocalORMSession.flush_all() r = self.app.get('/adobe/_admin/stats/', extra_environ=dict(username='******')) assert 'Deleted: 1' in r assert 'Private: 0' in r
def main(): broken_posts = BM.BlogPost.query.find(dict(neighborhood_id=None)).all() for post in broken_posts: c.project = post.app.project c.app = post.app post.neighborhood_id = post.app.project.neighborhood_id ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all()
def load(self): artifact_orm_session._get().skip_mod_date = True self.load_pages() self.project.notifications_disabled = False artifact_orm_session._get().skip_mod_date = False ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all() allura_base.log.info('Loading wiki done')
def setUp(): g._push_object(Globals()) c._push_object(mock.Mock()) request._push_object(Request.blank('/')) ThreadLocalORMSession.close_all() M.EmailAddress.query.remove({}) M.OpenIdNonce.query.remove({}) M.OpenIdAssociation.query.remove({})
def main(): M.TroveCategory(trove_cat_id=862, trove_parent_id=14, shortname="lppl", fullname="LaTeX Project Public License", fullpath="License :: OSI-Approved Open Source :: LaTeX Project Public License") M.TroveCategory(trove_cat_id=655, trove_parent_id=432, shortname="win64", fullname="64-bit MS Windows", fullpath="Operating System :: Grouping and Descriptive Categories :: 64-bit MS Windows") M.TroveCategory(trove_cat_id=657, trove_parent_id=418, shortname="vista", fullname="Vista", fullpath="Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Vista") M.TroveCategory(trove_cat_id=851, trove_parent_id=418, shortname="win7", fullname="Windows 7", fullpath="Operating System :: Modern (Vendor-Supported) Desktop Operating Systems :: Windows 7") M.TroveCategory(trove_cat_id=728, trove_parent_id=315, shortname="android", fullname="Android", fullpath="Operating System :: Handheld/Embedded Operating Systems :: Android") M.TroveCategory(trove_cat_id=780, trove_parent_id=315, shortname="ios", fullname="Apple iPhone", fullpath="Operating System :: Handheld/Embedded Operating Systems :: Apple iPhone") M.TroveCategory(trove_cat_id=863, trove_parent_id=534, shortname="architects", fullname="Architects", fullpath="Intended Audience :: by End-User Class :: Architects") M.TroveCategory(trove_cat_id=864, trove_parent_id=534, shortname="auditors", fullname="Auditors", fullpath="Intended Audience :: by End-User Class :: Auditors") M.TroveCategory(trove_cat_id=865, trove_parent_id=534, shortname="testers", fullname="Testers", fullpath="Intended Audience :: by End-User Class :: Testers") M.TroveCategory(trove_cat_id=866, trove_parent_id=534, shortname="secpros", fullname="Security Professionals", fullpath="Intended Audience :: by End-User Class :: Security Professionals") M.TroveCategory(trove_cat_id=867, trove_parent_id=535, shortname="secindustry", fullname="Security", fullpath="Intended Audience :: by Industry or Sector :: Security") ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all()
def custom(self, ticket, field, value): field = '_' + field if not c.app.has_custom_field(field): log.warning('Custom field %s is not defined, defining as string', field) c.app.globals.custom_fields.append(dict(name=field, label=field[1:].capitalize(), type='string')) ThreadLocalORMSession.flush_all() if 'custom_fields' not in ticket: ticket['custom_fields'] = {} ticket['custom_fields'][field] = value
def test_user_disabled(self, gen_message_id, sendmail): user = M.User.query.get(username='******') email = M.EmailAddress.query.find( {'claimed_by_user_id': user._id}).first() user.disabled = True ThreadLocalORMSession.flush_all() self.app.post('/auth/password_recovery_hash', {'email': email._id}) hash = user.get_tool_data('AuthPasswordReset', 'hash') assert hash is None
def test_user_project_already_deleted_creates_on_demand(): u = M.User.register(dict(username='******'), make_project=True) p = M.Project.query.get(shortname='u/foobar123') p.deleted = True ThreadLocalORMSession.flush_all() assert not M.Project.query.get(shortname='u/foobar123', deleted=False) assert u.private_project() ThreadLocalORMSession.flush_all() assert M.Project.query.get(shortname='u/foobar123', deleted=False)
def test_project_disabled_users(): p = M.Project.query.get(shortname="test") users = p.users() assert users[0].username == "test-admin" user = M.User.by_username("test-admin") user.disabled = True ThreadLocalORMSession.flush_all() users = p.users() assert users == []
def test_user_subproject_home_not_profile(self): u_proj = M.Project.query.get(shortname='u/test-admin') u_proj.new_subproject('sub1') from ming.orm.ormsession import ThreadLocalORMSession ThreadLocalORMSession.flush_all() r = self.app.get('/u/test-admin/sub1/') assert r.location.endswith('admin/'), r.location r.follow()
def test_related_artifacts(self): self._post(title='one') d = self._blog_date() self._post(title='two', text='[blog:%s/one]' % d) M.MonQTask.run_ready() ThreadLocalORMSession.flush_all() r = self.app.get('/blog/%s/one/' % d) assert 'Related' in r assert 'Blog: %s/two' % d in r
def setUp(self): super(TestGlobalsModel, self).setUp() c.project.install_app('Tickets', 'doc-bugs') ThreadLocalORMSession.flush_all()
def main(): u = M.User.query.get(username='******') u.display_name = 'Anonymous' ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all()
def create_project(pid, nbhd): M.session.artifact_orm_session._get().skip_mod_date = True data = loadjson(pid, pid + '.json') # pprint(data) log.info('Loading: %s %s %s' % (pid, data.data.title, data.data.path)) shortname = convert_project_shortname(data.data.path) project = M.Project.query.get( shortname=shortname, neighborhood_id=nbhd._id) if not project: private = (data.access_level == 'private') log.debug('Creating %s private=%s' % (shortname, private)) one_admin = [ u.userName for u in data.admins if u.status == 'Active'][0] project = nbhd.register_project(shortname, get_user(one_admin), project_name=data.data.title, private_project=private) project.notifications_disabled = True project.short_description = data.data.description project.last_updated = datetime.strptime( data.data.lastModifiedDate, '%Y-%m-%d %H:%M:%S') M.main_orm_session.flush(project) # TODO: push last_updated to gutenberg? # TODO: try to set createdDate? role_admin = M.ProjectRole.by_name('Admin', project) admin_usernames = set() for admin in data.admins: # FIXME: skip non-active users if admin.userName in skip_perms_usernames: continue admin_usernames.add(admin.userName) user = get_user(admin.userName) c.user = user pr = M.ProjectRole.by_user(user, project=project, upsert=True) pr.roles = [role_admin._id] ThreadLocalORMSession.flush_all() role_developer = M.ProjectRole.by_name('Developer', project) for member in data.members: # FIXME: skip non-active users if member.userName in skip_perms_usernames: continue if member.userName in admin_usernames: continue user = get_user(member.userName) pr = M.ProjectRole.by_user(user, project=project, upsert=True) pr.roles = [role_developer._id] ThreadLocalORMSession.flush_all() project.labels = [cat.path.split('projects/categorization.root.')[1] for cat in data.categories] icon_file = 'emsignia-MOBILITY-red.png' if 'nsn' in project.labels or 'msi' in project.labels: icon_file = 'emsignia-SOLUTIONS-blue.gif' if project.icon: M.ProjectFile.remove(dict(project_id=project._id, category='icon')) with open(os.path.join('..', 'scripts', icon_file)) as fp: M.ProjectFile.save_image( icon_file, fp, content_type=utils.guess_mime_type(icon_file), square=True, thumbnail_size=(48, 48), thumbnail_meta=dict(project_id=project._id, category='icon')) ThreadLocalORMSession.flush_all() dirs = os.listdir(os.path.join(options.output_dir, pid)) frs_mapping = loadjson(pid, 'frs_mapping.json') if not options.skip_wiki and 'wiki' in dirs: import_wiki(project, pid, nbhd) if not options.skip_frs_download and not project.app_instance('downloads'): project.install_app('Downloads', 'downloads') if 'forum' in dirs: import_discussion(project, pid, frs_mapping, shortname, nbhd) if 'news' in dirs: import_news(project, pid, frs_mapping, shortname, nbhd) project.notifications_disabled = False ThreadLocalORMSession.flush_all() return project
def import_discussion(project, pid, frs_mapping, sf_project_shortname, nbhd): from forgediscussion import model as DM discuss_app = project.app_instance('discussion') if not discuss_app: discuss_app = project.install_app('Discussion', 'discussion') h.set_context(project.shortname, 'discussion', neighborhood=nbhd) assert c.app # set permissions and config options role_admin = M.ProjectRole.by_name('Admin')._id role_developer = M.ProjectRole.by_name('Developer')._id role_auth = M.ProjectRole.by_name('*authenticated')._id role_anon = M.ProjectRole.by_name('*anonymous')._id discuss_app.config.acl = [ M.ACE.allow(role_anon, 'read'), M.ACE.allow(role_auth, 'post'), M.ACE.allow(role_auth, 'unmoderated_post'), M.ACE.allow(role_developer, 'moderate'), M.ACE.allow(role_admin, 'configure'), M.ACE.allow(role_admin, 'admin')] ThreadLocalORMSession.flush_all() DM.Forum.query.remove( dict(app_config_id=discuss_app.config._id, shortname='general')) forums = os.listdir(os.path.join(options.output_dir, pid, 'forum')) for forum in forums: ending = forum[-5:] forum_name = forum[:-5] if '.json' == ending and forum_name in forums: forum_data = loadjson(pid, 'forum', forum) fo = DM.Forum.query.get( shortname=forum_name, app_config_id=discuss_app.config._id) if not fo: fo = DM.Forum(app_config_id=discuss_app.config._id, shortname=forum_name) fo.name = forum_data.title fo.description = forum_data.description fo_num_topics = 0 fo_num_posts = 0 topics = os.listdir(os.path.join(options.output_dir, pid, 'forum', forum_name)) for topic in topics: ending = topic[-5:] topic_name = topic[:-5] if '.json' == ending and topic_name in topics: fo_num_topics += 1 topic_data = loadjson(pid, 'forum', forum_name, topic) thread_query = dict( subject=topic_data.title, discussion_id=fo._id, app_config_id=discuss_app.config._id) if not options.skip_thread_import_id_when_reloading: # temporary/transitional. Just needed the first time # running with this new code against an existing import # that didn't have import_ids thread_query['import_id'] = topic_data.id to = DM.ForumThread.query.get(**thread_query) if not to: to = DM.ForumThread.new( subject=topic_data.title, discussion_id=fo._id, import_id=topic_data.id, app_config_id=discuss_app.config._id) to.import_id = topic_data.id to_num_replies = 0 oldest_post = None newest_post = None posts = sorted( os.listdir(os.path.join(options.output_dir, pid, 'forum', forum_name, topic_name))) for post in posts: ending = post[-5:] post_name = post[:-5] if '.json' == ending: to_num_replies += 1 post_data = loadjson(pid, 'forum', forum_name, topic_name, post) p = DM.ForumPost.query.get( _id='%s%s@import' % ( post_name, str(discuss_app.config._id)), thread_id=to._id, discussion_id=fo._id, app_config_id=discuss_app.config._id) if not p: p = DM.ForumPost( _id='%s%s@import' % ( post_name, str( discuss_app.config._id)), thread_id=to._id, discussion_id=fo._id, app_config_id=discuss_app.config._id) create_date = datetime.strptime( post_data.createdDate, '%Y-%m-%d %H:%M:%S') p.timestamp = create_date p.author_id = str( get_user(post_data.createdByUserName)._id) p.text = convert_post_content( frs_mapping, sf_project_shortname, post_data.content, nbhd) p.status = 'ok' if post_data.replyToId: p.parent_id = '%s%s@import' % ( post_data.replyToId, str(discuss_app.config._id)) slug, full_slug = p.make_slugs( parent=p.parent, timestamp=create_date) p.slug = slug p.full_slug = full_slug if oldest_post is None or oldest_post.timestamp > create_date: oldest_post = p if newest_post is None or newest_post.timestamp < create_date: newest_post = p ThreadLocalORMSession.flush_all() to.num_replies = to_num_replies to.first_post_id = oldest_post._id to.last_post_date = newest_post.timestamp to.mod_date = newest_post.timestamp fo_num_posts += to_num_replies fo.num_topics = fo_num_topics fo.num_posts = fo_num_posts ThreadLocalORMSession.flush_all()
def tearDown(): ThreadLocalORMSession.close_all()
self.update_index(self.objects_deleted, arefs) for obj in self.objects_added: g.zarkov_event('create', extra=obj.index_id()) for obj in self.objects_modified: g.zarkov_event('modify', extra=obj.index_id()) for obj in self.objects_deleted: g.zarkov_event('delete', extra=obj.index_id()) self.objects_added = [] self.objects_modified = [] self.objects_deleted = [] def update_index(self, objects_deleted, arefs): # Post delete and add indexing operations from allura.tasks import index_tasks if objects_deleted: index_tasks.del_artifacts.post( [obj.index_id() for obj in objects_deleted]) if arefs: index_tasks.add_artifacts.post([aref._id for aref in arefs]) main_doc_session = Session.by_name('main') project_doc_session = Session.by_name('project') main_orm_session = ThreadLocalORMSession(main_doc_session) project_orm_session = ThreadLocalORMSession(project_doc_session) artifact_orm_session = ThreadLocalORMSession( doc_session=project_doc_session, extensions = [ ArtifactSessionExtension ]) repository_orm_session = ThreadLocalORMSession( doc_session=main_doc_session, extensions = [ ])
def setUp(): setup_basic_test() ThreadLocalORMSession.close_all() setup_global_objects()
def test_email_address_claimed_by_user(): addr = M.EmailAddress(_id='*****@*****.**', claimed_by_user_id=c.user._id) c.user.disabled = True ThreadLocalORMSession.flush_all() assert addr.claimed_by_user() is None
def test_openid_claimed_by_user(): oid = M.OpenId.upsert('http://google.com/accounts/1', 'My Google OID') c.user.disabled = True oid.claimed_by_user_id = c.user._id ThreadLocalORMSession.flush_all() assert oid.claimed_by_user() is None
def test_user_project_does_not_create_on_demand_for_anonymous_user(): u = M.User.anonymous() ThreadLocalORMSession.flush_all() assert not u.private_project() assert not M.Project.query.get(shortname='u/anonymous') assert not M.Project.query.get(shortname='u/*anonymous')
def test_user_project_does_not_create_on_demand_for_disabled_user(): u = M.User.register(dict(username='******', disabled=True), make_project=False) ThreadLocalORMSession.flush_all() assert not u.private_project() assert not M.Project.query.get(shortname='u/foobar123')
def test_user_project_creates_on_demand(): u = M.User.register(dict(username='******'), make_project=False) ThreadLocalORMSession.flush_all() assert not M.Project.query.get(shortname='u/foobar123') assert u.private_project() assert M.Project.query.get(shortname='u/foobar123')
def test_private_ticket(self): from allura.model import ProjectRole from allura.model import ACE, DENY_ALL from allura.lib.security import Credentials, has_access from allura.websetup import bootstrap admin = c.user creator = bootstrap.create_user('Not a Project Admin') developer = bootstrap.create_user('Project Developer') observer = bootstrap.create_user('Random Non-Project User') anon = User(_id=None, username='******', display_name='Anonymous') t = Ticket(summary='my ticket', ticket_num=3, reported_by_id=creator._id) assert creator == t.reported_by role_admin = ProjectRole.by_name('Admin')._id role_developer = ProjectRole.by_name('Developer')._id role_creator = ProjectRole.by_user(t.reported_by, upsert=True)._id ProjectRole.by_user( developer, upsert=True).roles.append(role_developer) ThreadLocalORMSession.flush_all() cred = Credentials.get().clear() t.private = True assert_equal(t.acl, [ ACE.allow(role_developer, 'save_searches'), ACE.allow(role_developer, 'read'), ACE.allow(role_developer, 'create'), ACE.allow(role_developer, 'update'), ACE.allow(role_developer, 'unmoderated_post'), ACE.allow(role_developer, 'post'), ACE.allow(role_developer, 'moderate'), ACE.allow(role_developer, 'delete'), ACE.allow(role_creator, 'read'), ACE.allow(role_creator, 'post'), ACE.allow(role_creator, 'create'), ACE.allow(role_creator, 'unmoderated_post'), DENY_ALL]) assert has_access(t, 'read', user=admin)() assert has_access(t, 'create', user=admin)() assert has_access(t, 'update', user=admin)() assert has_access(t, 'read', user=creator)() assert has_access(t, 'post', user=creator)() assert has_access(t, 'unmoderated_post', user=creator)() assert has_access(t, 'create', user=creator)() assert not has_access(t, 'update', user=creator)() assert has_access(t, 'read', user=developer)() assert has_access(t, 'create', user=developer)() assert has_access(t, 'update', user=developer)() assert not has_access(t, 'read', user=observer)() assert not has_access(t, 'create', user=observer)() assert not has_access(t, 'update', user=observer)() assert not has_access(t, 'read', user=anon)() assert not has_access(t, 'create', user=anon)() assert not has_access(t, 'update', user=anon)() t.private = False assert t.acl == [] assert has_access(t, 'read', user=admin)() assert has_access(t, 'create', user=admin)() assert has_access(t, 'update', user=admin)() assert has_access(t, 'read', user=developer)() assert has_access(t, 'create', user=developer)() assert has_access(t, 'update', user=developer)() assert has_access(t, 'read', user=creator)() assert has_access(t, 'unmoderated_post', user=creator)() assert has_access(t, 'create', user=creator)() assert not has_access(t, 'update', user=creator)() assert has_access(t, 'read', user=observer)() assert has_access(t, 'read', user=anon)()
def update_tickets(self, **post_data): from forgetracker.tracker_main import get_change_text, get_label tickets = Ticket.query.find( dict(_id={ '$in': [ObjectId(id) for id in aslist(post_data['__ticket_ids'])] }, app_config_id=self.app_config_id)).all() fields = set(['status', 'private']) values = {} labels = post_data.get('labels', []) for k in fields: v = post_data.get(k) if v: values[k] = v assigned_to = post_data.get('assigned_to') if assigned_to == '-': values['assigned_to_id'] = None elif assigned_to: user = c.project.user_in_project(assigned_to) if user: values['assigned_to_id'] = user._id private = post_data.get('private') if private: values['private'] = asbool(private) custom_values = {} custom_fields = {} for cf in self.custom_fields or []: v = post_data.get(cf.name) if v: custom_values[cf.name] = v custom_fields[cf.name] = cf changes = {} changed_tickets = {} for ticket in tickets: message = '' if labels: values['labels'] = self.append_new_labels( ticket.labels, labels.split(',')) for k, v in sorted(values.iteritems()): if k == 'assigned_to_id': new_user = User.query.get(_id=v) old_user = User.query.get(_id=getattr(ticket, k)) if new_user: message += get_change_text(get_label(k), new_user.display_name, old_user.display_name) elif k == 'private': def private_text(val): if val: return 'Yes' else: return 'No' message += get_change_text( get_label(k), private_text(v), private_text(getattr(ticket, k))) else: message += get_change_text(get_label(k), v, getattr(ticket, k)) setattr(ticket, k, v) for k, v in sorted(custom_values.iteritems()): def cf_val(cf): return ticket.get_custom_user(cf.name) \ if cf.type == 'user' \ else ticket.custom_fields.get(cf.name) cf = custom_fields[k] old_value = cf_val(cf) if cf.type == 'boolean': v = asbool(v) ticket.custom_fields[k] = v new_value = cf_val(cf) message += get_change_text(cf.label, new_value, old_value) if message != '': changes[ticket._id] = message changed_tickets[ticket._id] = ticket ticket.discussion_thread.post(message, notify=False) ticket.commit() filtered_changes = self.filtered_by_subscription(changed_tickets) users = User.query.find({ '_id': { '$in': filtered_changes.keys() } }).all() def changes_iter(user): for t_id in filtered_changes.get(user._id, []): # mark changes text as safe, thus it wouldn't be escaped in plain-text emails # html part of email is handled by markdown and it'll be properly escaped yield (changed_tickets[t_id], jinja2.Markup(changes[t_id])) mail = dict( sender=c.project.app_instance(self.app_config).email_address, fromaddr=str(c.user._id), reply_to=str(c.user._id), subject='[%s:%s] Mass edit changes by %s' % (c.project.shortname, self.app_config.options.mount_point, c.user.display_name), ) tmpl = g.jinja2_env.get_template('forgetracker:data/mass_report.html') head = [] for f, v in sorted(values.iteritems()): if f == 'assigned_to_id': user = User.query.get(_id=v) v = user.display_name if user else v head.append('- **%s**: %s' % (get_label(f), v)) for f, v in sorted(custom_values.iteritems()): cf = custom_fields[f] if cf.type == 'user': user = User.by_username(v) v = user.display_name if user else v head.append('- **%s**: %s' % (cf.label, v)) tmpl_context = { 'context': c, 'data': { 'header': jinja2.Markup('\n'.join(['Mass edit changing:', ''] + head)) } } for user in users: tmpl_context['data'].update({'changes': changes_iter(user)}) mail.update( dict(message_id=h.gen_message_id(), text=tmpl.render(tmpl_context), destinations=[str(user._id)])) mail_tasks.sendmail.post(**mail) if self.app_config.options.get('TicketMonitoringType') in ( 'AllTicketChanges', 'AllPublicTicketChanges'): monitoring_email = self.app_config.options.get( 'TicketMonitoringEmail') visible_changes = [] for t_id, t in changed_tickets.items(): if (not t.private or self.app_config.options.get('TicketMonitoringType') == 'AllTicketChanges'): visible_changes.append( (changed_tickets[t_id], jinja2.Markup(changes[t_id]))) if visible_changes: tmpl_context['data'].update({'changes': visible_changes}) mail.update( dict(message_id=h.gen_message_id(), text=tmpl.render(tmpl_context), destinations=[monitoring_email])) mail_tasks.sendmail.post(**mail) self.invalidate_bin_counts() ThreadLocalORMSession.flush_all() app = '%s/%s' % (c.project.shortname, self.app_config.options.mount_point) count = len(tickets) text = 'Updated {} ticket{} in {}'.format(count, 's' if count != 1 else '', app) Notification.post_user(c.user, None, 'flash', text=text)
class __mongometa__: session = ThreadLocalORMSession(Session.by_name('sprox_tests'))
def bootstrap(command, conf, vars): """Place any commands to setup allura here""" # are we being called by the test suite? test_run = conf.get('__file__', '').endswith('test.ini') # if this is a test_run, skip user project creation to save time make_user_projects = not test_run def make_user(*args, **kw): kw.update(make_project=make_user_projects) return create_user(*args, **kw) # Our bootstrap doesn't play nicely with SFX project and user APIs tg.config['auth.method'] = tg.config['registration.method'] = 'local' assert tg.config['auth.method'] == 'local' conf['auth.method'] = conf['registration.method'] = 'local' # Clean up all old stuff ThreadLocalORMSession.close_all() c.queued_messages = defaultdict(list) c.user = c.project = c.app = None database = conf.get('db_prefix', '') + 'project:test' wipe_database() try: g.solr.delete(q='*:*') except: # pragma no cover log.error('SOLR server is %s', g.solr_server) log.error('Error clearing solr index') if asbool(conf.get('cache_test_data')): if restore_test_data(): from allura.lib import helpers as h h.set_context('test', neighborhood='Projects') return log.info('Initializing search') log.info('Registering root user & default neighborhoods') anonymous = M.User(_id=None, username='******', display_name='Anonymous') # never make a user project for the root user root = create_user('Root', make_project=False) n_projects = M.Neighborhood(name='Projects', url_prefix='/p/', features=dict(private_projects=True, max_projects=None, css='none', google_analytics=False)) n_users = M.Neighborhood( name='Users', url_prefix='/u/', shortname_prefix='u/', anchored_tools='profile:Profile,userstats:Statistics', features=dict(private_projects=True, max_projects=None, css='none', google_analytics=False)) n_adobe = M.Neighborhood(name='Adobe', url_prefix='/adobe/', project_list_url='/adobe/', features=dict(private_projects=True, max_projects=None, css='custom', google_analytics=True)) assert tg.config['auth.method'] == 'local' project_reg = plugin.ProjectRegistrationProvider.get() p_projects = project_reg.register_neighborhood_project(n_projects, [root], allow_register=True) p_users = project_reg.register_neighborhood_project(n_users, [root]) p_adobe = project_reg.register_neighborhood_project(n_adobe, [root]) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all() # add the adobe icon file_name = 'adobe_icon.png' file_path = os.path.join(allura.__path__[0], 'public', 'nf', 'images', file_name) M.NeighborhoodFile.from_path(file_path, neighborhood_id=n_adobe._id) # Add some test users for unum in range(10): make_user('Test User %d' % unum) log.info('Creating basic project categories') cat1 = M.ProjectCategory(name='clustering', label='Clustering') cat2 = M.ProjectCategory(name='communications', label='Communications') cat2_1 = M.ProjectCategory(name='synchronization', label='Synchronization', parent_id=cat2._id) cat2_2 = M.ProjectCategory(name='streaming', label='Streaming', parent_id=cat2._id) cat2_3 = M.ProjectCategory(name='fax', label='Fax', parent_id=cat2._id) cat2_4 = M.ProjectCategory(name='bbs', label='BBS', parent_id=cat2._id) cat3 = M.ProjectCategory(name='database', label='Database') cat3_1 = M.ProjectCategory(name='front_ends', label='Front-Ends', parent_id=cat3._id) cat3_2 = M.ProjectCategory(name='engines_servers', label='Engines/Servers', parent_id=cat3._id) log.info('Registering "regular users" (non-root) and default projects') # since this runs a lot for tests, separate test and default users and # do the minimal needed if asbool(conf.get('load_test_data')): u_admin = make_user('Test Admin') u_admin.preferences = dict(email_address='*****@*****.**') u_admin.email_addresses = ['*****@*****.**'] u_admin.set_password('foo') u_admin.claim_address('*****@*****.**') else: u_admin = make_user('Admin 1', username='******') # Admin1 is almost root, with admin access for Users and Projects neighborhoods p_projects.add_user(u_admin, ['Admin']) p_users.add_user(u_admin, ['Admin']) p_allura = n_projects.register_project('allura', u_admin) u1 = make_user('Test User') p_adobe1 = n_adobe.register_project('adobe-1', u_admin) p_adobe.add_user(u_admin, ['Admin']) p0 = n_projects.register_project('test', u_admin) p1 = n_projects.register_project('test2', u_admin) p0._extra_tool_status = ['alpha', 'beta'] sess = session(M.Neighborhood) # all the sessions are the same for x in (n_adobe, n_projects, n_users, p_projects, p_users, p_adobe): # Ming doesn't detect substructural changes in newly created objects (vs loaded from DB) state(x).status = 'dirty' # TODO: Hope that Ming can be improved to at least avoid stuff below sess.flush(x) c.project = p0 c.user = u_admin p1 = p0.new_subproject('sub1') ThreadLocalORMSession.flush_all() if asbool(conf.get('load_test_data')): if asbool(conf.get('cache_test_data')): cache_test_data() else: # pragma no cover # regular first-time setup p0.add_user(u_admin, ['Admin']) log.info('Registering initial apps') for ep_name, app in g.entry_points['tool'].iteritems(): if not app.installable: continue p0.install_app(ep_name) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all()
def test_it_creates_status_field(self): g = c.app.globals g.open_status_names = 'open' g.closed_status_names = 'closed' ThreadLocalORMSession.flush_all() assert self.options_for_field('status')() == ['open', 'closed']
def test_only_shortname_multiple_projects_matched(self): adobe_n = M.Neighborhood.query.get(url_prefix='/adobe/') M.Project(shortname='test', neighborhood_id=adobe_n._id) ThreadLocalORMSession.flush_all() assert_equal((None, 'Too many matches for project: 2'), self.parse('test'))
def test_last_updated(_datetime): c.project.last_updated = datetime(2014, 1, 1) _datetime.utcnow.return_value = datetime(2014, 1, 2) WM.Page(title='TestPage1') ThreadLocalORMSession.flush_all() assert_equal(c.project.last_updated, datetime(2014, 1, 2))
def test_user_project_creates_on_demand(self): M.User.register(dict(username='******'), make_project=False) ThreadLocalORMSession.flush_all() self.app.get('/u/donald-duck/')
def test_that_it_has_ordered_custom_fields(self): custom_fields = dict(my_field='my value') Ticket(summary='my ticket', custom_fields=custom_fields, ticket_num=3) ThreadLocalORMSession.flush_all() ticket = Ticket.query.get(summary='my ticket') assert ticket.custom_fields == dict(my_field='my value')
def test_pull_rss_feeds(parsefeed): html_content = ("<p>1. foo</p>\n" "\n" "<p>\n" "#foo bar <a href='baz'>baz</a>\n" "foo bar\n" "</p>\n" "\n" "<p>#foo bar <a href='baz'>\n" "baz\n" "</a></p>\n") rendered_html_content = "\n".join([ r"1\. foo", "", r"\#foo bar [baz](baz) foo bar ", "", r"\#foo bar [ baz ](baz)", " [link](http://example.com/)", ]) parsefeed.return_value = _mock_feed( dict(title='Test', subtitle='test', summary='This is a test'), dict(content_type='text/plain', content='Test feed'), dict(content_type='text/html', content=html_content), dict(summary_detail=dict(type='text/html', value=html_content)), ) base_app = M.AppConfig.query.find().all()[0] tmp_app = M.AppConfig(tool_name=u'Blog', discussion_id=base_app.discussion_id, project_id=base_app.project_id, options={ u'ordinal': 0, u'show_right_bar': True, u'project_name': base_app.project.name, u'mount_point': u'blog', u'mount_label': u'Blog' }) new_external_feeds = ['http://example.com/news/feed/'] BM.Globals(app_config_id=tmp_app._id, external_feeds=new_external_feeds) ThreadLocalORMSession.flush_all() from forgeblog.command import rssfeeds cmd = rssfeeds.RssFeedsCommand('pull-rss-feeds') cmd.run([test_config, '-a', tmp_app._id]) cmd.command() parsefeed.assert_called_with('http://example.com/news/feed/') posts = BM.BlogPost.query.find({ 'app_config_id': tmp_app._id }).sort('timestamp', 1) assert_equal(posts.count(), 4) posts = posts.all() assert_equal(posts[0].title, 'Test') assert_equal(posts[0].text, 'This is a test [link](http://example.com/)') assert_equal(posts[1].title, 'Default Title 2') assert_equal(posts[1].text, 'Test feed [link](http://example.com/)') assert_equal(posts[2].title, 'Default Title 3') assert_equal(posts[2].text, rendered_html_content) assert_equal(posts[3].title, 'Default Title 4') assert_equal(posts[3].text, rendered_html_content)
def import_wiki(project, pid, nbhd): from forgewiki import model as WM def upload_attachments(page, pid, beginning): dirpath = os.path.join(options.output_dir, pid, 'wiki', beginning) if not os.path.exists(dirpath): return files = os.listdir(dirpath) for f in files: with open(os.path.join(options.output_dir, pid, 'wiki', beginning, f)) as fp: page.attach(f, fp, content_type=utils.guess_mime_type(f)) pages = os.listdir(os.path.join(options.output_dir, pid, 'wiki')) # handle the homepage content if 'homepage_text.markdown' in pages: home_app = project.app_instance('home') h.set_context(project.shortname, 'home', neighborhood=nbhd) # set permissions and config options role_admin = M.ProjectRole.by_name('Admin')._id role_anon = M.ProjectRole.by_name('*anonymous')._id home_app.config.options['show_discussion'] = False home_app.config.options['show_left_bar'] = False home_app.config.options['show_right_bar'] = False home_app.config.acl = [ M.ACE.allow(role_anon, 'read'), M.ACE.allow(role_admin, 'create'), M.ACE.allow(role_admin, 'edit'), M.ACE.allow(role_admin, 'delete'), M.ACE.allow(role_admin, 'moderate'), M.ACE.allow(role_admin, 'configure'), M.ACE.allow(role_admin, 'admin')] p = WM.Page.upsert('Home') p.text = wiki2markdown(load(pid, 'wiki', 'homepage_text.markdown')) upload_attachments(p, pid, 'homepage') if 'HomePage.json' in pages and 'HomePage.markdown' in pages: wiki_app = project.app_instance('wiki') if not wiki_app: wiki_app = project.install_app('Wiki', 'wiki') h.set_context(project.shortname, 'wiki', neighborhood=nbhd) # set permissions and config options role_admin = M.ProjectRole.by_name('Admin')._id role_anon = M.ProjectRole.by_name('*anonymous')._id wiki_app.config.options['show_discussion'] = False wiki_app.config.options['show_left_bar'] = False wiki_app.config.options['show_right_bar'] = False wiki_app.config.acl = [ M.ACE.allow(role_anon, 'read'), M.ACE.allow(role_admin, 'create'), M.ACE.allow(role_admin, 'edit'), M.ACE.allow(role_admin, 'delete'), M.ACE.allow(role_admin, 'moderate'), M.ACE.allow(role_admin, 'configure'), M.ACE.allow(role_admin, 'admin')] # make all the wiki pages for page in pages: ending = page[-5:] beginning = page[:-5] markdown_file = '%s.markdown' % beginning if '.json' == ending and markdown_file in pages: page_data = loadjson(pid, 'wiki', page) content = load(pid, 'wiki', markdown_file) if page == 'HomePage.json': globals = WM.Globals.query.get( app_config_id=wiki_app.config._id) if globals is not None: globals.root = page_data.title else: globals = WM.Globals( app_config_id=wiki_app.config._id, root=page_data.title) p = WM.Page.upsert(page_data.title) p.viewable_by = ['all'] p.text = wiki2markdown(content) # upload attachments upload_attachments(p, pid, beginning) if not p.history().first(): p.commit() ThreadLocalORMSession.flush_all()
def command(self): self.basic_setup() self.hostname = socket.gethostname() self.taskd_status_log = self.args[1] self.stuck_pids = [] self.error_tasks = [] self.suspicious_tasks = [] taskd_pids = self._taskd_pids() base.log.info('Taskd processes on %s: %s' % (self.hostname, taskd_pids)) # find stuck taskd processes base.log.info('Seeking for stuck taskd processes') for pid in taskd_pids: base.log.info('...sending USR1 to %s and watching status log' % (pid)) status = self._check_taskd_status(int(pid)) if status != 'OK': base.log.info('...taskd pid %s has stuck' % pid) self.stuck_pids.append(pid) if self.options.kill: base.log.info('...-k is set. Killing %s' % pid) self._kill_stuck_taskd(pid) else: base.log.info('...%s' % status) # find 'forsaken' tasks base.log.info('Seeking for forsaken busy tasks') tasks = [t for t in self._busy_tasks() if t not in self.error_tasks] # skip seen tasks base.log.info('Found %s busy tasks on %s' % (len(tasks), self.hostname)) for task in tasks: base.log.info('Verifying task %s' % task) pid = task.process.split()[-1] if pid not in taskd_pids: # 'forsaken' task base.log.info('Task is forsaken ' '(can\'t find taskd with given pid). ' 'Setting state to \'error\'') task.state = 'error' task.result = 'Can\'t find taskd with given pid' self.error_tasks.append(task) else: # check if taskd with given pid really processing this task # now: base.log.info( 'Checking that taskd pid %s is really processing task %s' % (pid, task._id)) status = self._check_task(pid, task) if status != 'OK': # maybe task moved quickly and now is complete # so we need to check such tasks later # and mark incomplete ones as 'error' self.suspicious_tasks.append(task) base.log.info('...NO. Adding task to suspisious list') else: base.log.info('...OK') # check suspicious task and mark incomplete as error base.log.info('Checking suspicious list for incomplete tasks') self._check_suspicious_tasks() ThreadLocalORMSession.flush_all() self.print_summary()
def main(): create_trove_cat((639,14,"cpal","Common Public Attribution License 1.0 (CPAL)","License :: OSI-Approved Open Source :: Common Public Attribution License 1.0 (CPAL)")) create_trove_cat((640,99,"dvd","DVD","Topic :: Multimedia :: DVD")) create_trove_cat((641,576,"workflow","Workflow","Topic :: Office/Business :: Enterprise :: Workflow")) create_trove_cat((642,292,"linuxdrivers","Linux","Topic :: System :: Hardware :: Hardware Drivers :: Linux")) create_trove_cat((643,582,"uml","UML","Topic :: Software Development :: Design :: UML")) create_trove_cat((644,92,"cms","CMS Systems","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CMS Systems")) create_trove_cat((645,92,"blogging","Blogging","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Blogging")) create_trove_cat((646,52,"subversion","Subversion","Topic :: Software Development :: Version Control :: Subversion")) create_trove_cat((647,612,"webservices","Web Services","Topic :: Formats and Protocols :: Protocols :: Web Services")) create_trove_cat((648,554,"json","JSON","Topic :: Formats and Protocols :: Data Formats :: JSON")) create_trove_cat((649,100,"imagegalleries","Image Galleries","Topic :: Multimedia :: Graphics :: Image Galleries")) create_trove_cat((650,612,"ajax","AJAX","Topic :: Formats and Protocols :: Protocols :: AJAX")) create_trove_cat((651,92,"wiki","Wiki","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Wiki")) create_trove_cat((652,45,"appservers","Application Servers","Topic :: Software Development :: Application Servers")) create_trove_cat((653,20,"rssreaders","RSS Feed Readers","Topic :: Communications :: RSS Feed Readers")) create_trove_cat((654,129,"ecommerce","E-Commerce / Shopping","Topic :: Office/Business :: E-Commerce / Shopping")) create_trove_cat((656,99,"htpc","Home Theater PC","Topic :: Multimedia :: Home Theater PC")) create_trove_cat((658,22,"jabber","Jabber","Topic :: Communications :: Chat :: Jabber")) create_trove_cat((659,576,"enterprisebpm","Business Performance Management","Topic :: Office/Business :: Enterprise :: Business Performance Management")) create_trove_cat((660,576,"enterprisebi","Business Intelligence","Topic :: Office/Business :: Enterprise :: Business Intelligence")) create_trove_cat((661,75,"budgetingandforecasting","Budgeting and Forecasting","Topic :: Office/Business :: Financial :: Budgeting and Forecasting")) create_trove_cat((662,497,"ingres","Ingres","Database Environment :: Network-based DBMS :: Ingres")) create_trove_cat((663,92,"socialnetworking","Social Networking","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Social Networking")) create_trove_cat((664,199,"virtualization","Virtualization","Operating System :: Virtualization")) create_trove_cat((665,664,"vmware","VMware","Operating System :: Virtualization :: VMware")) create_trove_cat((666,664,"xen","Xen","Operating System :: Virtualization :: Xen")) create_trove_cat((667,247,"voip","VoIP","Topic :: Communications :: Telephony :: VoIP")) create_trove_cat((668,92,"ticketing","Ticketing Systems","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Ticketing Systems")) create_trove_cat((669,315,"blackberryos","Blackberry RIM OS","Operating System :: Handheld/Embedded Operating Systems :: Blackberry RIM OS")) create_trove_cat((671,14,"ms-pl","Microsoft Public License","License :: OSI-Approved Open Source :: Microsoft Public License")) create_trove_cat((672,14,"ms-rl","Microsoft Reciprocal License","License :: OSI-Approved Open Source :: Microsoft Reciprocal License")) create_trove_cat((673,576,"bsm","Business Service Management","Topic :: Office/Business :: Enterprise :: Business Service Management")) create_trove_cat((674,673,"servicesupport","Service Support","Topic :: Office/Business :: Enterprise :: Business Service Management :: Service Support")) create_trove_cat((675,673,"serviceassurance","Service Assurance","Topic :: Office/Business :: Enterprise :: Business Service Management :: Service Assurance")) create_trove_cat((676,673,"serviceautomation","Service Automation","Topic :: Office/Business :: Enterprise :: Business Service Management :: Service Automation")) create_trove_cat((677,14,"artisticv2","Artistic License 2.0","License :: OSI-Approved Open Source :: Artistic License 2.0")) create_trove_cat((678,14,"boostlicense","Boost Software License (BSL1.0)","License :: OSI-Approved Open Source :: Boost Software License (BSL1.0)")) create_trove_cat((679,14,"gplv3","GNU General Public License version 3.0 (GPLv3)","License :: OSI-Approved Open Source :: GNU General Public License version 3.0 (GPLv3)")) create_trove_cat((680,14,"lgplv3","GNU Library or ""Lesser"" General Public License version 3.0 (LGPLv3)","License :: OSI-Approved Open Source :: GNU Library or ""Lesser"" General Public License version 3.0 (LGPLv3)")) create_trove_cat((681,14,"isclicense","ISC License","License :: OSI-Approved Open Source :: ISC License")) create_trove_cat((682,14,"multicslicense","Multics License","License :: OSI-Approved Open Source :: Multics License")) create_trove_cat((683,14,"ntplicense","NTP License","License :: OSI-Approved Open Source :: NTP License")) create_trove_cat((684,14,"nposl3","Non-Profit Open Software License 3.0 (Non-Profit OSL 3.0)","License :: OSI-Approved Open Source :: Non-Profit Open Software License 3.0 (Non-Profit OSL 3.0)")) create_trove_cat((685,14,"rpl15","Reciprocal Public License 1.5 (RPL1.5)","License :: OSI-Approved Open Source :: Reciprocal Public License 1.5 (RPL1.5)")) create_trove_cat((686,14,"splicense2","Simple Public License 2.0","License :: OSI-Approved Open Source :: Simple Public License 2.0")) create_trove_cat((687,673,"cmdb","Configuration Management Database (CMDB)","Topic :: Office/Business :: Enterprise :: Business Service Management :: Configuration Management Database (CMDB)")) create_trove_cat((688,18,"mobileapps","Mobile","Topic :: Mobile")) create_trove_cat((689,315,"winmobile","Windows Mobile","Operating System :: Handheld/Embedded Operating Systems :: Windows Mobile")) create_trove_cat((690,315,"brew","BREW (Binary Runtime Environment for Wireless)","Operating System :: Handheld/Embedded Operating Systems :: BREW (Binary Runtime Environment for Wireless)")) create_trove_cat((691,315,"j2me","J2ME (Java Platform, Micro Edition)","Operating System :: Handheld/Embedded Operating Systems :: J2ME (Java Platform, Micro Edition)")) create_trove_cat((692,315,"maemo","Maemo","Operating System :: Handheld/Embedded Operating Systems :: Maemo")) create_trove_cat((693,315,"limo","LiMo (Linux Mobile)","Operating System :: Handheld/Embedded Operating Systems :: LiMo (Linux Mobile)")) create_trove_cat((694,160,"clean","Clean","Programming Language :: Clean")) create_trove_cat((695,160,"lasso","Lasso","Programming Language :: Lasso")) create_trove_cat((696,160,"turing","Turing","Programming Language :: Turing")) create_trove_cat((697,160,"glsl","GLSL (OpenGL Shading Language)","Programming Language :: GLSL (OpenGL Shading Language)")) create_trove_cat((698,160,"lazarus","Lazarus","Programming Language :: Lazarus")) create_trove_cat((699,160,"freepascal","Free Pascal","Programming Language :: Free Pascal")) create_trove_cat((700,160,"scriptol","Scriptol","Programming Language :: Scriptol")) create_trove_cat((701,160,"pl-i","PL/I (Programming Language One)","Programming Language :: PL/I (Programming Language One)")) create_trove_cat((702,160,"oz","Oz","Programming Language :: Oz")) create_trove_cat((703,160,"limbo","Limbo","Programming Language :: Limbo")) create_trove_cat((704,160,"scala","Scala","Programming Language :: Scala")) create_trove_cat((705,160,"blitzmax","BlitzMax","Programming Language :: BlitzMax")) create_trove_cat((706,160,"xbaseclipper","XBase/Clipper","Programming Language :: XBase/Clipper")) create_trove_cat((707,160,"curl","Curl","Programming Language :: Curl")) create_trove_cat((708,160,"flex","Flex","Programming Language :: Flex")) create_trove_cat((709,160,"mathematica","Mathematica","Programming Language :: Mathematica")) create_trove_cat((710,160,"visualdataflex","Visual DataFlex","Programming Language :: Visual DataFlex")) create_trove_cat((711,160,"fenix","Fenix","Programming Language :: Fenix")) create_trove_cat((713,456,"vexi","Vexi","User Interface :: Graphical :: Vexi")) create_trove_cat((714,160,"kaya","Kaya","Programming Language :: Kaya")) create_trove_cat((715,160,"transcript-revolution","Transcript/Revolution","Programming Language :: Transcript/Revolution")) create_trove_cat((716,160,"haXe","haXe","Programming Language :: haXe")) create_trove_cat((717,160,"proglangmeta","Project is a programming language","Programming Language :: Project is a programming language")) create_trove_cat((718,634,"msxb360","Microsoft Xbox 360","Operating System :: Other Operating Systems :: Console-based Platforms :: Microsoft Xbox 360")) create_trove_cat((719,634,"nintendogc","Nintendo GameCube","Operating System :: Other Operating Systems :: Console-based Platforms :: Nintendo GameCube")) create_trove_cat((720,634,"nintendowii","Nintendo Wii","Operating System :: Other Operating Systems :: Console-based Platforms :: Nintendo Wii")) create_trove_cat((721,634,"sonyps3","Sony PlayStation 3","Operating System :: Other Operating Systems :: Console-based Platforms :: Sony PlayStation 3")) create_trove_cat((722,634,"sonypsp","Sony PlayStation Portable (PSP)","Operating System :: Other Operating Systems :: Console-based Platforms :: Sony PlayStation Portable (PSP)")) create_trove_cat((723,160,"scilab","Scilab","Programming Language :: Scilab")) create_trove_cat((724,160,"scicos","Scicos","Programming Language :: Scicos")) create_trove_cat((725,534,"management","Management","Intended Audience :: by End-User Class :: Management")) create_trove_cat((726,71,"edadministration","Administration","Topic :: Education :: Administration")) create_trove_cat((727,97,"mechcivileng","Mechanical and Civil Engineering","Topic :: Scientific/Engineering :: Mechanical and Civil Engineering")) create_trove_cat((729,535,"audienceengineering","Engineering","Intended Audience :: by Industry or Sector :: Engineering")) create_trove_cat((730,274,"basque","Basque (Euskara)","Translations :: Basque (Euskara)")) create_trove_cat((731,14,"classpath","GNU General Public License with Classpath exception (Classpath::License)","License :: OSI-Approved Open Source :: GNU General Public License with Classpath exception (Classpath::License)")) create_trove_cat((732,727,"caddcam","Computer-aided technologies (CADD/CAM/CAE)","Topic :: Scientific/Engineering :: Mechanical and Civil Engineering :: Computer-aided technologies (CADD/CAM/CAE)")) create_trove_cat((733,576,"humanresources","Human Resources","Topic :: Office/Business :: Enterprise :: Human Resources")) create_trove_cat((734,554,"mcml","Media Center Markup Language (MCML)","Topic :: Formats and Protocols :: Data Formats :: Media Center Markup Language (MCML)")) create_trove_cat((735,461,"nsis","Nullsoft Scriptable Install System (NSIS)","User Interface :: Plugins :: Nullsoft Scriptable Install System (NSIS)")) create_trove_cat((736,97,"scada","SCADA","Topic :: Scientific/Engineering :: SCADA")) create_trove_cat((737,461,"autohotkey","AutoHotkey","User Interface :: Plugins :: AutoHotkey")) create_trove_cat((738,160,"autoit","AutoIt","Programming Language :: AutoIt")) create_trove_cat((739,132,"humanitarianism","Humanitarianism","Topic :: Religion and Philosophy :: Humanitarianism")) create_trove_cat((740,129,"insurance","Insurance","Topic :: Office/Business :: Insurance")) create_trove_cat((741,97,"linguistics","Linguistics","Topic :: Scientific/Engineering :: Linguistics")) create_trove_cat((742,741,"machinetranslation","Machine Translation","Topic :: Scientific/Engineering :: Linguistics :: Machine Translation")) create_trove_cat((743,43,"antispam","Anti-Spam","Topic :: Security :: Anti-Spam")) create_trove_cat((744,43,"antivirus","Anti-Virus","Topic :: Security :: Anti-Virus")) create_trove_cat((745,43,"antimalware","Anti-Malware","Topic :: Security :: Anti-Malware")) create_trove_cat((746,554,"autocaddxf","AutoCAD DXF","Topic :: Formats and Protocols :: Data Formats :: AutoCAD DXF")) create_trove_cat((747,75,"billing","Billing","Topic :: Office/Business :: Financial :: Billing")) create_trove_cat((748,576,"processmanagement","Business Process Management","Topic :: Office/Business :: Enterprise :: Business Process Management")) create_trove_cat((749,136,"embedded","Embedded systems","Topic :: System :: Embedded systems")) create_trove_cat((750,456,"magicui","Magic User Interface (MUI)","User Interface :: Graphical :: Magic User Interface (MUI)")) create_trove_cat((751,237,"xul","XUL","User Interface :: Web-based :: XUL")) create_trove_cat((752,80,"flightsim","Flight simulator","Topic :: Games/Entertainment :: Flight simulator")) create_trove_cat((753,63,"vivim","Vi/Vim","Topic :: Text Editors :: Vi/Vim")) create_trove_cat((754,45,"sourceanalysis","Source code analysis","Topic :: Software Development :: Source code analysis")) create_trove_cat((755,45,"sourcebrowsing","Source code browsing","Topic :: Software Development :: Source code browsing")) create_trove_cat((756,576,"plm","Product lifecycle management (PLM)","Topic :: Office/Business :: Enterprise :: Product lifecycle management (PLM)")) create_trove_cat((757,274,"breton","Breton","Translations :: Breton")) create_trove_cat((758,498,"db4o","db4objects (db4o)","Database Environment :: File-based DBMS :: db4objects (db4o)")) create_trove_cat((759,497,"nexusdb","NexusDB","Database Environment :: Network-based DBMS :: NexusDB")) create_trove_cat((760,160,"prism","Prism","Programming Language :: Prism")) create_trove_cat((761,45,"collaborative","Collaborative development tools","Topic :: Software Development :: Collaborative development tools")) create_trove_cat((762,91,"pluginsaddons","Plugins and add-ons","Topic :: Internet :: WWW/HTTP :: Browsers :: Plugins and add-ons")) create_trove_cat((763,456,"winaero","Windows Aero","User Interface :: Graphical :: Windows Aero")) create_trove_cat((764,45,"agile","Agile development tools","Topic :: Software Development :: Agile development tools")) create_trove_cat((765,535,"agriculture","Agriculture","Intended Audience :: by Industry or Sector :: Agriculture")) create_trove_cat((766,100,"animation","Animation","Topic :: Multimedia :: Graphics :: Animation")) create_trove_cat((767,45,"assemblers","Assemblers","Topic :: Software Development :: Assemblers")) create_trove_cat((768,535,"automotive","Automotive","Intended Audience :: by Industry or Sector :: Automotive")) create_trove_cat((769,554,"CSV","Comma-separated values (CSV)","Topic :: Formats and Protocols :: Data Formats :: Comma-separated values (CSV)")) create_trove_cat((770,45,"softdevlibraries","Libraries","Topic :: Software Development :: Libraries")) create_trove_cat((771,45,"sourcereview","Source code review","Topic :: Software Development :: Source code review")) create_trove_cat((772,80,"hobbies","Hobbies","Topic :: Games/Entertainment :: Hobbies")) create_trove_cat((773,772,"collectionmanage","Collection management","Topic :: Games/Entertainment :: Hobbies :: Collection management")) create_trove_cat((774,80,"multiplayer","Multiplayer","Topic :: Games/Entertainment :: Multiplayer")) create_trove_cat((775,80,"mmorpg","MMORPG","Topic :: Games/Entertainment :: MMORPG")) create_trove_cat((776,97,"mapping","Mapping","Topic :: Scientific/Engineering :: Mapping")) create_trove_cat((777,776,"gps","GPS (Global Positioning System)","Topic :: Scientific/Engineering :: Mapping :: GPS (Global Positioning System)")) create_trove_cat((778,43,"passwordmanage","Password manager","Topic :: Security :: Password manager")) create_trove_cat((779,315,"linksyswrt54g","Linksys WRT54G series","Operating System :: Handheld/Embedded Operating Systems :: Linksys WRT54G series")) create_trove_cat((781,576,"medhealth","Medical/Healthcare","Topic :: Office/Business :: Enterprise :: Medical/Healthcare")) create_trove_cat((782,45,"bined","Binary editors","Topic :: Software Development :: Binary editors")) create_trove_cat((783,99,"mmcatalog","Cataloguing","Topic :: Multimedia :: Cataloguing")) create_trove_cat((784,113,"composition","Composition","Topic :: Multimedia :: Sound/Audio :: Composition")) create_trove_cat((785,772,"cooking","Cooking","Topic :: Games/Entertainment :: Hobbies :: Cooking")) create_trove_cat((786,136,"cron","Cron and scheduling","Topic :: System :: Cron and scheduling")) create_trove_cat((787,638,"recovery","Data recovery","Topic :: System :: Storage :: Data recovery")) create_trove_cat((788,87,"otherfile","Other file transfer protocol","Topic :: Internet :: Other file transfer protocol")) create_trove_cat((789,581,"digpreserve","Digital preservation","Topic :: Education :: Library :: Digital preservation")) create_trove_cat((790,251,"directconnect","Direct Connect","Topic :: Communications :: File Sharing :: Direct Connect")) create_trove_cat((791,129,"dtp","Desktop Publishing","Topic :: Office/Business :: Desktop Publishing")) create_trove_cat((792,580,"etl","ETL","Topic :: Office/Business :: Enterprise :: Data Warehousing :: ETL")) create_trove_cat((793,55,"fonts","Fonts","Topic :: Desktop Environment :: Fonts")) create_trove_cat((794,80,"gameframeworks","Game development framework","Topic :: Games/Entertainment :: Game development framework")) create_trove_cat((795,100,"handrec","Handwriting recognition","Topic :: Multimedia :: Graphics :: Handwriting recognition")) create_trove_cat((796,136,"homeauto","Home Automation","Topic :: System :: Home Automation")) create_trove_cat((797,63,"translation","Computer Aided Translation (CAT)","Topic :: Text Editors :: Computer Aided Translation (CAT)")) create_trove_cat((798,136,"osdistro","OS distribution","Topic :: System :: OS distribution")) create_trove_cat((799,798,"livecd","Live CD","Topic :: System :: OS distribution :: Live CD")) create_trove_cat((800,497,"lotusnotes","Lotus Notes/Domino","Database Environment :: Network-based DBMS :: Lotus Notes/Domino")) create_trove_cat((801,160,"lotusscript","LotusScript","Programming Language :: LotusScript")) create_trove_cat((802,133,"machinelearning","Machine Learning","Topic :: Scientific/Engineering :: Artificial Intelligence :: Machine Learning")) create_trove_cat((803,106,"metadata","Metadata editors","Topic :: Multimedia :: Graphics :: Editors :: Metadata editors")) create_trove_cat((804,236,"riscos","RISC OS","Operating System :: Other Operating Systems :: RISC OS")) create_trove_cat((805,282,"politics","Politics","Topic :: Social sciences :: Politics")) create_trove_cat((806,80,"sports","Sports","Topic :: Games/Entertainment :: Sports")) create_trove_cat((807,282,"psychology","Psychology","Topic :: Social sciences :: Psychology")) create_trove_cat((808,458,"ogre3d","Ogre3D","User Interface :: Toolkits/Libraries :: Ogre3D")) create_trove_cat((809,45,"orm","ORM (Object-relational mapping)","Topic :: Software Development :: ORM (Object-relational mapping)")) create_trove_cat((810,575,"perftest","Performance Testing","Topic :: Software Development :: Testing :: Performance Testing")) create_trove_cat((811,75,"personalfinance","Personal finance","Topic :: Office/Business :: Financial :: Personal finance")) create_trove_cat((812,499,"pearmdb2","PHP Pear::MDB2","Database Environment :: Database API :: PHP Pear::MDB2")) create_trove_cat((813,461,"intellij","IntelliJ","User Interface :: Plugins :: IntelliJ")) create_trove_cat((814,554,"postscript","PostScript","Topic :: Formats and Protocols :: Data Formats :: PostScript")) create_trove_cat((815,100,"fractals","Fractals and Procedural Generation","Topic :: Multimedia :: Graphics :: Fractals and Procedural Generation")) create_trove_cat((816,554,"w3cvoice","W3C Voice","Topic :: Formats and Protocols :: Data Formats :: W3C Voice")) create_trove_cat((817,97,"quantumcomp","Quantum Computing","Topic :: Scientific/Engineering :: Quantum Computing")) create_trove_cat((818,129,"reportgen","Report Generators","Topic :: Office/Business :: Report Generators")) create_trove_cat((819,581,"research","Research","Topic :: Education :: Library :: Research")) create_trove_cat((820,87,"ssh","SSH (Secure SHell)","Topic :: Internet :: SSH (Secure SHell)")) create_trove_cat((821,554,"semantic","Semantic Web (RDF, OWL, etc.)","Topic :: Formats and Protocols :: Data Formats :: Semantic Web (RDF, OWL, etc.)")) create_trove_cat((822,90,"socialbookmarking","Social Bookmarking","Topic :: Internet :: WWW/HTTP :: Social Bookmarking")) create_trove_cat((823,20,"synchronization","Synchronization","Topic :: Communications :: Synchronization")) create_trove_cat((824,45,"templates","Templates","Topic :: Software Development :: Templates")) create_trove_cat((825,97,"testmeasure","Test and Measurement","Topic :: Scientific/Engineering :: Test and Measurement")) create_trove_cat((826,98,"statistics","Statistics","Topic :: Scientific/Engineering :: Mathematics :: Statistics")) create_trove_cat((827,129,"knowledgemanagement","Knowledge Management","Topic :: Office/Business :: Knowledge Management")) create_trove_cat((828,147,"unattended","Unattended","Topic :: System :: Installation/Setup :: Unattended")) create_trove_cat((829,457,"emailinterface","Email-based interface","User Interface :: Textual :: Email-based interface")) create_trove_cat((830,282,"voting","Voting","Topic :: Social sciences :: Voting")) create_trove_cat((831,27,"webconferencing","Web Conferencing","Topic :: Communications :: Conferencing :: Web Conferencing")) create_trove_cat((832,27,"videoconferencing","Video Conferencing","Topic :: Communications :: Conferencing :: Video Conferencing")) create_trove_cat((833,160,"objectivec2","Objective-C 2.0","Programming Language :: Objective-C 2.0")) create_trove_cat((834,274,"georgian","Georgian","Translations :: Georgian")) create_trove_cat((835,499,"adonet","ADO.NET","Database Environment :: Database API :: ADO.NET")) create_trove_cat((836,554,"xbrl","XBRL","Topic :: Formats and Protocols :: Data Formats :: XBRL")) create_trove_cat((837,461,"excel","Excel","User Interface :: Plugins :: Excel")) create_trove_cat((838,160,"visualbasicforapplications","Visual Basic for Applications (VBA)","Programming Language :: Visual Basic for Applications (VBA)")) create_trove_cat((839,160,"booprogramminglang","Boo","Programming Language :: Boo")) create_trove_cat((840,52,"git","Git","Topic :: Software Development :: Version Control :: Git")) create_trove_cat((841,52,"mercurial","Mercurial","Topic :: Software Development :: Version Control :: Mercurial")) create_trove_cat((842,52,"bazaar","Bazaar","Topic :: Software Development :: Version Control :: Bazaar")) create_trove_cat((843,14,"eupublicense","European Union Public License","License :: OSI-Approved Open Source :: European Union Public License")) create_trove_cat((844,14,"ipafontlicense","IPA Font License","License :: OSI-Approved Open Source :: IPA Font License")) create_trove_cat((845,14,"miroslicense","MirOS License","License :: OSI-Approved Open Source :: MirOS License")) create_trove_cat((846,14,"openfontlicense11","Open Font License 1.1 (OFL 1.1)","License :: OSI-Approved Open Source :: Open Font License 1.1 (OFL 1.1)")) create_trove_cat((847,80,"realtimetactical","Real Time Tactical","Topic :: Games/Entertainment :: Real Time Tactical")) create_trove_cat((848,160,"algol68","ALGOL 68","Programming Language :: ALGOL 68")) create_trove_cat((849,92,"groupware","Groupware","Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Groupware")) create_trove_cat((850,576,"businesscontinuity","Business Continuity","Topic :: Office/Business :: Enterprise :: Business Continuity")) create_trove_cat((852,554,"teiformat","TEI","Topic :: Formats and Protocols :: Data Formats :: TEI")) create_trove_cat((853,160,"clarion","Clarion","Programming Language :: Clarion")) create_trove_cat((854,576,"sales","Sales","Topic :: Office/Business :: Enterprise :: Sales")) create_trove_cat((855,97,"buildingauto","Building Automation","Topic :: Scientific/Engineering :: Building Automation")) create_trove_cat((856,129,"businessmodelling","Modelling","Topic :: Office/Business :: Modelling")) create_trove_cat((857,150,"routing","Routing","Topic :: System :: Networking :: Routing")) create_trove_cat((858,97,"medicalphysics","Medical Physics","Topic :: Scientific/Engineering :: Medical Physics")) create_trove_cat((859,71,"edlanguage","Languages","Topic :: Education :: Languages")) create_trove_cat((860,97,"molecularmech","Molecular Mechanics","Topic :: Scientific/Engineering :: Molecular Mechanics")) create_trove_cat((861,148,"loganalysis","Log Analysis","Topic :: System :: Logging :: Log Analysis")) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all()
def exit(self, status): self.project.notifications_disabled = False ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all() exit(status)
def setUp(self): setup_basic_test() ThreadLocalORMSession.close_all() setup_global_objects() self.provider = ProjectRegistrationProvider() self.parse = self.provider.project_from_url
def globals_with_custom_fields(custom_fields): c.app.globals.custom_fields = custom_fields ThreadLocalORMSession.flush_all() return c.app.globals
def setUp(self): setup_basic_test() ThreadLocalORMSession.close_all() setup_global_objects() self.provider = plugin.LocalAuthenticationProvider(Request.blank('/'))
def bootstrap(command, conf, vars): """Place any commands to setup allura here""" # are we being called by the test suite? test_run = conf.get('__file__', '').endswith('test.ini') if not test_run: # when this is run via the `setup-app` cmd, some macro rendering needs this set up REGISTRY.register(ew.widget_context, ew.core.WidgetContext('http', ew.ResourceManager())) create_test_data = asbool(os.getenv('ALLURA_TEST_DATA', True)) # if this is a test_run, skip user project creation to save time make_user_projects = not test_run def make_user(*args, **kw): kw.update(make_project=make_user_projects) return create_user(*args, **kw) # Temporarily disable auth extensions to prevent unintended side-effects tg.config['auth.method'] = tg.config['registration.method'] = 'local' assert tg.config['auth.method'] == 'local' conf['auth.method'] = conf['registration.method'] = 'local' # Clean up all old stuff ThreadLocalORMSession.close_all() c.user = c.project = c.app = None wipe_database() try: g.solr.delete(q='*:*') except: # pragma no cover log.error('SOLR server is %s', g.solr_server) log.error('Error clearing solr index') # set up mongo indexes index = EnsureIndexCommand('ensure_index') index.run(['']) if create_test_data and asbool(conf.get('cache_test_data')): if restore_test_data(): h.set_context('test', neighborhood='Projects') return log.info('Initializing search') log.info('Registering root user & default neighborhoods') M.User( _id=None, username='******', display_name='Anonymous') # never make a user project for the root user if create_test_data: root = create_user('Root', make_project=False) else: from getpass import getpass root_name = raw_input('Enter username for root user (default "root"): ').strip() if not root_name: root_name = 'root' ok = False while not ok: root_password1 = getpass('Enter password: '******'Password must not be empty') continue root_password2 = getpass('Confirm password: '******'t match") continue root = create_user(root_name, password=root_password1, make_project=False) ok = True n_projects = M.Neighborhood(name='Projects', url_prefix='/p/', features=dict(private_projects=True, max_projects=None, css='none', google_analytics=False)) n_users = M.Neighborhood(name='Users', url_prefix='/u/', shortname_prefix='u/', anchored_tools='profile:Profile,userstats:Statistics', features=dict(private_projects=True, max_projects=None, css='none', google_analytics=False)) assert tg.config['auth.method'] == 'local' project_reg = plugin.ProjectRegistrationProvider.get() p_projects = project_reg.register_neighborhood_project( n_projects, [root], allow_register=True) p_users = project_reg.register_neighborhood_project(n_users, [root]) def set_nbhd_wiki_content(nbhd_proj, content): wiki = nbhd_proj.app_instance('wiki') page = WM.Page.query.get( app_config_id=wiki.config._id, title=wiki.root_page_name) page.text = content set_nbhd_wiki_content(p_projects, dedent(''' Welcome to the "Projects" neighborhood. It is the default neighborhood in Allura. You can edit this wiki page as you see fit. Here's a few ways to get started: [Register a new project](/p/add_project) [Neighborhood administration](/p/admin) [[projects show_total=yes]] ''')) set_nbhd_wiki_content(p_users, dedent(''' This is the "Users" neighborhood. All users automatically get a user-project created for them, using their username. [Neighborhood administration](/u/admin) [[projects show_total=yes]] ''')) if create_test_data: n_adobe = M.Neighborhood( name='Adobe', url_prefix='/adobe/', project_list_url='/adobe/', features=dict(private_projects=True, max_projects=None, css='custom', google_analytics=True)) p_adobe = project_reg.register_neighborhood_project(n_adobe, [root]) set_nbhd_wiki_content(p_adobe, dedent(''' This is the "Adobe" neighborhood. It is just an example of having projects in a different neighborhood. [Neighborhood administration](/adobe/admin) [[projects show_total=yes]] ''')) # add the adobe icon file_name = 'adobe_icon.png' file_path = os.path.join( allura.__path__[0], 'public', 'nf', 'images', file_name) M.NeighborhoodFile.from_path(file_path, neighborhood_id=n_adobe._id) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all() if create_test_data: # Add some test users for unum in range(10): make_user('Test User %d' % unum) log.info('Creating basic project categories') M.ProjectCategory(name='clustering', label='Clustering') cat2 = M.ProjectCategory(name='communications', label='Communications') M.ProjectCategory( name='synchronization', label='Synchronization', parent_id=cat2._id) M.ProjectCategory( name='streaming', label='Streaming', parent_id=cat2._id) M.ProjectCategory(name='fax', label='Fax', parent_id=cat2._id) M.ProjectCategory(name='bbs', label='BBS', parent_id=cat2._id) cat3 = M.ProjectCategory(name='database', label='Database') M.ProjectCategory( name='front_ends', label='Front-Ends', parent_id=cat3._id) M.ProjectCategory( name='engines_servers', label='Engines/Servers', parent_id=cat3._id) if create_test_data: log.info('Registering "regular users" (non-root) and default projects') # since this runs a lot for tests, separate test and default users and # do the minimal needed if asbool(conf.get('load_test_data')): u_admin = make_user('Test Admin') u_admin.preferences = dict(email_address='*****@*****.**') u_admin.email_addresses = ['*****@*****.**'] u_admin.set_password('foo') u_admin.claim_address('*****@*****.**') ThreadLocalORMSession.flush_all() admin_email = M.EmailAddress.get(email='*****@*****.**') admin_email.confirmed = True else: u_admin = make_user('Admin 1', username='******') # Admin1 is almost root, with admin access for Users and Projects # neighborhoods p_projects.add_user(u_admin, ['Admin']) p_users.add_user(u_admin, ['Admin']) n_projects.register_project('allura', u_admin, 'Allura') make_user('Test User') n_adobe.register_project('adobe-1', u_admin, 'Adobe project 1') p_adobe.add_user(u_admin, ['Admin']) p0 = n_projects.register_project('test', u_admin, 'Test Project') n_projects.register_project('test2', u_admin, 'Test 2') p0._extra_tool_status = ['alpha', 'beta'] sess = session(M.Neighborhood) # all the sessions are the same _list = (n_projects, n_users, p_projects, p_users) if create_test_data: _list += (n_adobe, p_adobe) for x in _list: # Ming doesn't detect substructural changes in newly created objects # (vs loaded from DB) state(x).status = 'dirty' # TODO: Hope that Ming can be improved to at least avoid stuff below sess.flush(x) ThreadLocalORMSession.flush_all() if asbool(conf.get('load_test_data')): if asbool(conf.get('cache_test_data')): cache_test_data() else: # pragma no cover # regular first-time setup create_trove_categories = CreateTroveCategoriesCommand('create_trove_categories') create_trove_categories.run(['']) if create_test_data: p0.add_user(u_admin, ['Admin']) log.info('Registering initial apps') with h.push_config(c, user=u_admin): p0.install_apps([{'ep_name': ep_name} for ep_name, app in g.entry_points['tool'].iteritems() if app._installable(tool_name=ep_name, nbhd=n_projects, project_tools=[]) ]) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all() if create_test_data: # reload our p0 project so that p0.app_configs is accurate with all the # newly installed apps p0 = M.Project.query.get(_id=p0._id) sub = p0.new_subproject('sub1', project_name='A Subproject') with h.push_config(c, user=u_admin): sub.install_app('wiki') ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all()