#------------------------------------------------------------------------------
# $Id$
# $URL$
# Copyright (c) 2006, Ilias Lazaridis - All Rights Reserved
#------------------------------------------------------------------------------

from trac.core import *
from trac.env import IEnvironmentSetupParticipant
from trac.ticket.query import Query

#------------------------------------------------------------------------------
    
class QueryFieldsets(Component):

    implements(IEnvironmentSetupParticipant)       
    
    def get_fieldsets(self):
        """ (dev-status: beta) returns a dictionary of user-defined fieldsets
        
        Those fieldsets are defined in trac-ini within the section
        
        [ticket-query-fieldsets]        
        fieldsetname=id,summary,owner,changetime
        anothersetname=id,summary,time
        default=id,summary
        
        specify a query parameter &fieldset=fieldsetname
        
        if fieldset is ommited, the default fieldset is used
        if default is unspecified, the standard-trac fieldset is used
        
        """

        config = self.config['ticket-query-fieldsets']
        
        fieldsets = {}
        for option, value in config.options():
            fieldsets[option] = config.getlist(option, sep=',')

        return fieldsets
    
    def __init__(self):
        # on Component activation, override existent method with new one
        get_default_columns_patch()
        from_string_patch()
        pass
        
#TODO trac:#4190 - replace dummies to force component initialization
    # IEnvironmentSetupParticipant    
    def environment_created(self):           pass
    def environment_needs_upgrade(self, db): return False
    def upgrade_environment(self, db):       pass
    
#------------------------------------------------------------------------------

get_default_columns_old = Query.get_default_columns
   
def get_default_columns_new(self, *args):
    """ Overrides trac.ticket.query.Query.get_default_columns
    """
       
    # call original function
    cols = get_default_columns_old(self, *args)
    
    # retrieve user defined fieldsets
    fieldsets = QueryFieldsets(self.env).get_fieldsets()    
    
    if hasattr(self, 'fieldset'):
    #if self.fieldset:
        if fieldsets.has_key(self.fieldset):
            cols = fieldsets[self.fieldset]
        else:
            self.env.log.debug('fieldset %s not defined, please check trac.ini', self.fieldset)
    else:
        if fieldsets.has_key('default'):
            cols = fieldsets['default']

            
    return cols

def get_default_columns_patch():
    if Query.get_default_columns != get_default_columns_new: 
        get_default_columns_old = Query.get_default_columns
        Query.get_default_columns = get_default_columns_new

#------------------------------------------------------------------------------

from_string_old = Query.from_string

def from_string_new(cls,env, string, **kw):
    """ Overrides the default behaviour of trac.ticket.query.Query
    """

    # call original method to instantiate a query object
    query = from_string_old(env, string, **kw)    
   
    # retrieve the fieldset parameter from the query-string
    fieldset = ''
    filters = string.split('&')
    for keyval in filters:
        param, value = keyval.split('=')
        param = str(param)
        if param == 'fieldset':
            fieldset = value

    # set the fieldset attribute on the query-object
    setattr(query, 'fieldset', fieldset)
    
    #remove the fieldset which has gone into the contraints
    query.constraints.pop('fieldset', '')
    
    return query
    
def from_string_patch():
    if Query.from_string != from_string_new: 
        from_string_old = Query.from_string
        Query.from_string = classmethod(from_string_new )