def test_validate_ticket_negativevalue_returnstuple(self): req = {} ticket = Ticket(self.env) ticket['estimatedhours'] = '-1' self.assertTrue(ticket.get_value_or_default('estimatedhours')) msg = _("Please enter a positive value for Estimated Hours") self.assertEquals(msg, self.hours_thp.validate_ticket(req, ticket)[0][1])
def post_process_request(self, req, template, data, content_type): if template == 'timeline.html': filter_projects = self._filtered_projects(req) if not filter_projects: #no filter means likely more than 1 project, so we insert the project name filter_projects = [project[1] for project in self.__SmpModel.get_all_projects()] if filter_projects: filtered_events = [] tickettypes = ("newticket", "editedticket", "closedticket", "attachment", "reopenedticket") self._old_render_fn = [] self._current_project = [] self._read_idx = -1 for event in data['events']: if event['kind'] in tickettypes: resource = event['kind'] == "attachment" and event['data'][0].parent or event['data'][0] if resource.realm == "ticket": ticket = Ticket( self.env, resource.id ) project = ticket.get_value_or_default('project') if project and project in filter_projects: if len(filter_projects) > 1: #only if more than 1 filtered project #store the old render function and the project to be inserted self._old_render_fn.append(event['render']) self._current_project.append(project) #redirect to our new render function (which will insert the project name) event['render'] = self._render_ticket_event #add to the list of displayed events filtered_events.append(event) else: filtered_events.append(event) data['events'] = filtered_events return template, data, content_type
def update_connections(self): ''' Rewrite Ticket Dependencies ''' # search choosen connection of tickets dep_from = self.get_args('ppdep_from') dep_to = self.get_args('ppdep_to') # 1. check for numbers if dep_from == None or dep_to == None or ( not dep_from.strip().isdigit() ) or ( not dep_to.strip().isdigit() ): return False dep_from = dep_from.strip() dep_to = dep_to.strip() # 2. check for valid tkid if ( not Ticket.id_is_valid( dep_from ) ) or ( not Ticket.id_is_valid( dep_to ) ): return False toticket = Ticket( self.env, int(dep_to) ) # 3. check valid ticket from database if toticket.id == None: return False # get dependencies depstring = toticket.get_value_or_default( self.conf.get( 'custom_dependency_field' ) ) if depstring != None: deps = pputil.ticketIDsFromString( depstring ) else: deps = set() # modify dependencies if int(dep_from) in deps: comstring = "removed dependency #%s" % str(dep_from) deps.remove( int(dep_from) ) else: comstring = "added dependency #%s" % str(dep_from) deps.add( int(dep_from) ) # build new depstring depstring = ",".join( [ str(d) for d in deps ] ) toticket[ self.conf.get( 'custom_dependency_field' ) ] = depstring # commit try: if not toticket.save_changes( self.req.authname, comstring ): raise TracError( "Could not update Ticket #%s " % str(dep_to) ) except: return False return True
def update_connections(self): ''' Rewrite Ticket Dependencies ''' # search choosen connection of tickets dep_from = self.get_args('ppdep_from') dep_to = self.get_args('ppdep_to') # 1. check for numbers if dep_from == None or dep_to == None or ( not dep_from.strip().isdigit()) or ( not dep_to.strip().isdigit()): return False dep_from = dep_from.strip() dep_to = dep_to.strip() # 2. check for valid tkid if (not Ticket.id_is_valid(dep_from)) or ( not Ticket.id_is_valid(dep_to)): return False toticket = Ticket(self.env, int(dep_to)) # 3. check valid ticket from database if toticket.id == None: return False # get dependencies depstring = toticket.get_value_or_default( self.conf.get('custom_dependency_field')) if depstring != None: deps = pputil.ticketIDsFromString(depstring) else: deps = set() # modify dependencies if int(dep_from) in deps: comstring = "removed dependency #%s" % str(dep_from) deps.remove(int(dep_from)) else: comstring = "added dependency #%s" % str(dep_from) deps.add(int(dep_from)) # build new depstring depstring = ",".join([str(d) for d in deps]) toticket[self.conf.get('custom_dependency_field')] = depstring # commit try: if not toticket.save_changes(self.req.authname, comstring): raise TracError("Could not update Ticket #%s " % str(dep_to)) except: return False return True
def post_process_request(self, req, template, data, content_type): if template == 'timeline.html': filter_projects = self._filtered_projects(req) if not filter_projects: #no filter means likely more than 1 project, so we insert the project name filter_projects = [ project[1] for project in self.__SmpModel.get_all_projects() ] if filter_projects: filtered_events = [] tickettypes = ("newticket", "editedticket", "closedticket", "attachment", "reopenedticket") self._old_render_fn = [] self._current_project = [] self._read_idx = -1 for event in data['events']: if event['kind'] in tickettypes: resource = event['kind'] == "attachment" and event[ 'data'][0].parent or event['data'][0] if resource.realm == "ticket": ticket = Ticket(self.env, resource.id) project = ticket.get_value_or_default('project') if project and project in filter_projects: if len( filter_projects ) > 1: #only if more than 1 filtered project #store the old render function and the project to be inserted self._old_render_fn.append(event['render']) self._current_project.append(project) #redirect to our new render function (which will insert the project name) event['render'] = self._render_ticket_event #add to the list of displayed events filtered_events.append(event) else: filtered_events.append(event) data['events'] = filtered_events return template, data, content_type
def _get_user_data_(self, req, milestone, field, results, fields): """Get data grouped by users. Includes extra user info.""" ats = AgileToolsSystem(self.env) sp = SimplifiedPermissions(self.env) tickets_json = defaultdict(lambda: defaultdict(dict)) all_users = [] user_data = {} use_avatar = self.config.get('avatar','mode').lower() != 'off' # TODO: allow the task board to respect user groups for group, data in sp.group_memberships().items(): for member in data['members']: if member.sid not in user_data: all_users.append(member.sid); user_data[member.sid] = { 'name': member.get("name", member.sid), 'avatar': use_avatar and req.href.avatar(member.sid) or None } def name_for_sid(sid): return user_data[sid]["name"] if sid in user_data else sid options = [""] + sorted(all_users, key=name_for_sid) for result in results: ticket = Ticket(self.env, result['id']) filtered_result = dict((k, v) for k, v in result.iteritems() if k in fields) filtered_result['position'] = ats.position(result['id']) filtered_result['_changetime'] = to_utimestamp(result['changetime']) # we use Trac's to_json() (through add_script_data), so # we'll replace any types which can't be json serialised for k, v in filtered_result.items(): if isinstance(v, datetime): filtered_result[k] = pretty_age(v) group_field_val = ticket.get_value_or_default(field["name"]) or "" tickets_json[group_field_val][result["id"]] = filtered_result return (field["name"], tickets_json, options, user_data)
def _get_standard_data_(self, req, milestone, field, results, fields): """Get ticket information when no custom grouped-by method present.""" ats = AgileToolsSystem(self.env) tickets_json = defaultdict(lambda: defaultdict(dict)) # Allow for the unset option options = [""] + [option for option in field["options"]] for result in results: ticket = Ticket(self.env, result['id']) filtered_result = dict((k, v) for k, v in result.iteritems() if k in fields) filtered_result['position'] = ats.position(result['id']) filtered_result['_changetime'] = to_utimestamp(result['changetime']) # we use Trac's to_json() (through add_script_data), so # we'll replace any types which can't be json serialised for k, v in filtered_result.items(): if isinstance(v, datetime): filtered_result[k] = pretty_age(v) group_field_val = ticket.get_value_or_default(field["name"]) or "" tickets_json[group_field_val][result["id"]] = filtered_result return (field["name"], tickets_json, options)