def test_owner_from_changed_component(self): """ Verify that the owner of a new ticket is updated when the component is changed. """ component1 = Component(self.env) component1.name = 'test1' component1.owner = 'joe' component1.insert() component2 = Component(self.env) component2.name = 'test2' component2.owner = 'kate' component2.insert() ticket = Ticket(self.env) ticket['reporter'] = 'santa' ticket['summary'] = 'Foo' ticket['component'] = 'test1' ticket['status'] = 'new' tktid = ticket.insert() ticket = Ticket(self.env, tktid) ticket['component'] = 'test2' ticket.save_changes('jane', 'Testing') self.assertEqual('kate', ticket['owner'])
def test_owner_from_changed_component(self): """ Verify that the owner of a new ticket is updated when the component is changed. """ component1 = Component(self.env) component1.name = "test1" component1.owner = "joe" component1.insert() component2 = Component(self.env) component2.name = "test2" component2.owner = "kate" component2.insert() ticket = Ticket(self.env) ticket["reporter"] = "santa" ticket["summary"] = "Foo" ticket["component"] = "test1" ticket["status"] = "new" tktid = ticket.insert() ticket = Ticket(self.env, tktid) ticket["component"] = "test2" ticket.save_changes("jane", "Testing") self.assertEqual("kate", ticket["owner"])
def test_no_disown_from_changed_component(self): """ Verify that a ticket is not disowned when the component is changed to a non-assigned component. """ component1 = Component(self.env) component1.name = "test1" component1.owner = "joe" component1.insert() component2 = Component(self.env) component2.name = "test2" component2.owner = "" component2.insert() ticket = Ticket(self.env) ticket["reporter"] = "santa" ticket["summary"] = "Foo" ticket["component"] = "test1" ticket["status"] = "new" tktid = ticket.insert() ticket = Ticket(self.env, tktid) ticket["component"] = "test2" ticket.save_changes("jane", "Testing") self.assertEqual("joe", ticket["owner"])
def test_no_disown_from_changed_component(self): """ Verify that a ticket is not disowned when the component is changed to a non-assigned component. """ component1 = Component(self.env) component1.name = 'test1' component1.owner = 'joe' component1.insert() component2 = Component(self.env) component2.name = 'test2' component2.owner = '' component2.insert() ticket = Ticket(self.env) ticket['reporter'] = 'santa' ticket['summary'] = 'Foo' ticket['component'] = 'test1' ticket['status'] = 'new' tktid = ticket.insert() ticket = Ticket(self.env, tktid) ticket['component'] = 'test2' ticket.save_changes('jane', 'Testing') self.assertEqual('joe', ticket['owner'])
def update_trac_components(self, group, env): if self.dummy_run: self.note("Would update Trac components for group '%s'" % group.acronym) else: self.note("Updating Trac componets for group '%s'" % group.acronym) components = Component.select(env) comp_names = [c.name for c in components] group_docs = group.document_set.filter(states__slug='active', type_id='draft').distinct() group_comp = [] for doc in group_docs: if not doc.name.startswith('draft-'): self.log( "While adding components: unexpectd %s group doc name: %s" % (group.acronym, doc.name)) continue name = doc.name[len('draft-'):] if name.startswith('ietf-'): name = name[len('ietf-'):] elif name.startswith('irtf-'): name = name[len('ietf-'):] if name.startswith(group.acronym + '-'): name = name[len(group.acronym + '-'):] group_comp.append(name) if not name in comp_names and not doc.name in comp_names: self.note(" Group draft: %s" % doc.name) self.note(" Adding component %s" % name) comp = Component(env) comp.name = name comp.owner = "*****@*****.**" % doc.name comp.insert()
def test_create_and_update(self): component = Component(self.env) component.name = 'Test' component.insert() self.assertEqual([('Test', None, None)], self.env.db_query(""" SELECT name, owner, description FROM component WHERE name='Test'""")) # Use the same model object to update the component component.owner = 'joe' component.update() self.assertEqual([('Test', 'joe', None)], self.env.db_query( "SELECT name, owner, description FROM component WHERE name='Test'"))
def test_create_and_update(self): component = Component(self.env) component.name = "Test" component.insert() cursor = self.db.cursor() cursor.execute("SELECT name,owner,description FROM component " "WHERE name='Test'") self.assertEqual(("Test", None, None), cursor.fetchone()) # Use the same model object to update the component component.owner = "joe" component.update() cursor.execute("SELECT name,owner,description FROM component " "WHERE name='Test'") self.assertEqual(("Test", "joe", None), cursor.fetchone())
def test_owner_from_component(self): """ Verify that the owner of a new ticket is set to the owner of the component. """ component = Component(self.env) component.name = "test" component.owner = "joe" component.insert() ticket = Ticket(self.env) ticket["reporter"] = "santa" ticket["summary"] = "Foo" ticket["component"] = "test" ticket.insert() self.assertEqual("joe", ticket["owner"])
def test_create_and_update(self): component = Component(self.env) component.name = 'Test' component.insert() cursor = self.db.cursor() cursor.execute("SELECT name,owner,description FROM component " "WHERE name='Test'") self.assertEqual(('Test', None, None), cursor.fetchone()) # Use the same model object to update the component component.owner = 'joe' component.update() cursor.execute("SELECT name,owner,description FROM component " "WHERE name='Test'") self.assertEqual(('Test', 'joe', None), cursor.fetchone())
def test_owner_from_component(self): """ Verify that the owner of a new ticket is set to the owner of the component. """ component = Component(self.env) component.name = 'test' component.owner = 'joe' component.insert() ticket = Ticket(self.env) ticket['reporter'] = 'santa' ticket['summary'] = 'Foo' ticket['component'] = 'test' ticket.insert() self.assertEqual('joe', ticket['owner'])
def _add_component(self, name='test', owner='owner1'): component = Component(self.env) component.name = name component.owner = owner component.insert()
def _insert_component(self, name): component = Component(self.env) component.name = name component.insert() return component
def create_hack(self, req, data, vars): import fcntl messages = [] created = False have_lock = False lockfile = open(self.lockfile, "w") try: rv = fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) if rv: raise TracError('Failed to acquire lock, error: %i' % rv) have_lock = True except IOError: messages.append( 'A hack is currently being created by another user. ' 'Please wait a few seconds, then click the "Create hack" ' 'button again.' ) if have_lock: steps_done = [] try: # Step 1: create repository paths from os import popen svn_path = 'file://%s' % \ self.env.config.get('trac', 'repository_dir') svn_path = svn_path.rstrip('/') page_name = vars['WIKINAME'] hack_path = vars['LCNAME'] paths = [ '%s/%s' % (svn_path, hack_path) ] selected_releases = data['selected_releases'] if isinstance(selected_releases, (basestring, unicode)): selected_releases = [ selected_releases, ] for release in selected_releases: if release == 'anyrelease': continue paths.append("%s/%s/%s" % \ (svn_path, hack_path, release)) cmd = '/usr/bin/op create-hack %s ' % req.authname cmd += '"New hack %s, created by %s" ' % \ (page_name, req.authname) cmd += '%s 2>&1' % ' '.join(paths) output = popen(cmd).readlines() if output: raise Exception( "Failed to create Subversion paths:\n%s" % \ '\n'.join(output) ) steps_done.append('repository') # Step 2: Add permissions from svnauthz.model import User, Path, PathAcl authz_file = self.env.config.get('trac', 'authz_file') authz = AuthzFileReader().read(authz_file) svn_path_acl = PathAcl(User(req.authname), r=True, w=True) authz.add_path(Path("/%s" % hack_path, acls = [svn_path_acl,])) AuthzFileWriter().write(authz_file, authz) steps_done.append('permissions') # Step 3: Add component component = TicketComponent(self.env) component.name = page_name component.owner = req.authname component.insert() steps_done.append('component') # Step 4: Create wiki page template_page = WikiPage(self.env, self.template) page = WikiPage(self.env, page_name) page.text = Template(template_page.text).substitute(vars) page.save(req.authname, 'New hack %s, created by %s' % \ (page_name, req.authname), '0.0.0.0') steps_done.append('wiki') # Step 5: Tag the new wiki page res = Resource('wiki', page_name) tags = data['tags'].split() + selected_releases + [data['type']] TagSystem(self.env).set_tags(req, res, tags) steps_done.append('tags') rv = fcntl.flock(lockfile, fcntl.LOCK_UN) created = True except Exception, e: try: if 'tags' in steps_done: res = Resource('wiki', page_name) tags = data['tags'].split() + selected_releases TagSystem(self.env).delete_tags(req, res, tags) if 'wiki' in steps_done: WikiPage(self.env, page_name).delete() if 'component' in steps_done: TicketComponent(self.env, page_name).delete() if 'permissions' in steps_done: authz_file = self.env.config.get('trac', 'authz_file') authz = AuthzFileReader().read(authz_file) authz.del_path(Path("/%s" % hack_path)) AuthzFileWriter().write(authz_file, authz) # TODO: rollback subversion path creation rv = fcntl.flock(lockfile, fcntl.LOCK_UN) except: self.env.log.error("Rollback failed") rv = fcntl.flock(lockfile, fcntl.LOCK_UN) self.env.log.error(e, exc_info=True) raise TracError(str(e))