Ejemplo n.º 1
0
 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])
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
 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])
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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)