Ejemplo n.º 1
0
class EggOMaticWeb(object):
    
    __error = 'ERROR: bad URL, clean your nose -> %s'
    
    def __init__(self, dataset, compute_ranks, compute_mono_rank, build_indexes, max_per_rank=100, index_url='http://127.0.0.1:8080', debug=False):
        self.__debug = debug
        self.__index_url = index_url
        self.__eggomatic = EggOMatic(dataset, compute_ranks, compute_mono_rank, build_indexes)
        self.__html_helper = EggHelper(self.__debug, max_per_rank)
        self.__html_helper.set_index_url(index_url)
        self.__max_per_rank = max_per_rank
        
    def set_index_url(self, index_url):
        self.__html_helper.set_index_url(index_url)
        
    def set_debug(self, flag):
        self.__debug = flag
        
    def index(self):
        return self.__html_helper.header() + self.__html_helper.end()
    index.exposed = True

    def query(self, tags, clustering='0'):
        clustering = clustering == '1'                
        tags = tags.strip().lower()
        match = re.search('[a-z0-9\- ]+', tags)
        if len(tags) > 0 and (not match or len(match.group()) != len(tags)):
            return self.__html_helper.bad_input(tags)
        tags = map(lambda x:x.strip(),tags.split(' '))
        cluster, rank = [], []
        print 'TAGS: %s' % tags
        if not tags or len(tags) == 0 or (len(tags)==1 and tags[0]==''):
            rank = self.__eggomatic.rank_by_tag('')
        elif len(tags) > 1:
            for tag in tags:
                if not self.__eggomatic.good_tag(tag):
                    return self.__html_helper.bad_tag(tag)
            ranks = self.__eggomatic.rank_by_tags(tags)
            for tag in tags:
                if self.__eggomatic.good_tag(tag):
                    cluster.append(tag)
        else: # len(tags) == 1:
            if not self.__eggomatic.good_tag(tags[0]):
                return self.__html_helper.bad_tag(tags[0])
            elif self.__eggomatic.has_bigger_cluster(tags[0]):
                cluster_number = 0
                if clustering:
                    if not self.__eggomatic.has_many_clusters(tags[0]):
                        cluster = self.__eggomatic.clusters(tags[0])[0]
                    else:
                        clusters = self.__eggomatic.clusters(tags[0])
                        return self.__html_helper.choose_cluster_page(clusters, self.__eggomatic.total_users(), self.__eggomatic.total_tags())
                else:
                    cluster = [tags[0]]
                ranks = self.__eggomatic.rank_by_tag(tags[0], clustering, cluster_number)
            else:
                cluster = [tags[0]]
                ranks = self.__eggomatic.rank_by_tag(tags[0])
                # TODO ask if has more than one cluster.
#        else:
#            return self.__html_helper.header() + self.__html_helper.end()
        cluster = list(cluster)
        cluster.sort()
        return self.__html_helper.complete_page(ranks, cluster, self.__eggomatic.total_users(), self.__eggomatic.total_tags())
    query.exposed = True

    def query_user(self, user, clustering='0'):
        
        clustering = clustering == '1'
        user = user.strip() #.lower()
        match = re.search('[A-Za-z0-9\-]+', user)
        if len(user) == 0:
            return self.index()        
        if (not match or len(match.group()) != len(user)):
            return self.__html_helper.bad_input_user(user)
        if not self.__eggomatic.good_user(user):
            return self.__html_helper.bad_user(user)
        
        if clustering:
            rank = self.__eggomatic.user_ranks_clustering(user)            
        else:        
            rank = self.__eggomatic.user_ranks(user)            
        return self.__html_helper.complete_page_user(rank, [user], self.__eggomatic.total_users(), self.__eggomatic.total_tags(), clustering)
    query_user.exposed = True



    def default(self, param):
        print 'default'
        param = param.lower()
        match = re.search('[a-z\-_]+', param)
        if not match:
            return self.__error % str(param)
        
        param = param.lower()
        tags = param.split('_')
        
        if len(tags) == 1:
            rank = self.__eggomatic.rank_by_tag(tags[0])
        
             
        
    default.exposed = True