class BdrAuthorizationMiddleware(SimpleItem):

    recheck_interval = 300

    def __init__(self, url):
        self.recheck_interval = 300
        self.lockedDownCollections = PersistentMapping()

    def setServiceRecheckInterval(self, seconds):
        self.recheck_interval = seconds

    @ram.cache(lambda *args, **kwargs: args[2] + str(time() // kwargs['recheck_interval']))
    def getUserCollectionPaths(self, username, recheck_interval=recheck_interval):
        logger.debug("Get companies from middleware for ecas user: %s" % username)
        accessiblePaths = self.FGASRegistryAPI.getCollectionPaths(username)
        return accessiblePaths

    def authorizedUser(self, username, path):
        if self.lockedCollection(path):
            logger.warning("This collection is locked down: %s!" % path)
            return False
        accessiblePaths = self.getUserCollectionPaths(username, recheck_interval=self.recheck_interval)
        if path in accessiblePaths.get('paths'):
            return "RW"
        if path in accessiblePaths.get('prev_paths'):
            return "RO"

    def lockDownCollection(self, path, user):
        if path not in self.lockedDownCollections:
            self.lockedDownCollections[path] = None
        self.lockedDownCollections[path] = {'state': 'locked',
                                            'ts': time(),
                                            'user': user}

    def unlockCollection(self, path, user):
        if path not in self.lockedDownCollections:
            # log unlock without lock
            self.lockedDownCollections[path] = None
        self.lockedDownCollections[path] = {'state': 'unlocked',
                                            'ts': time(),
                                            'user': user}

    def lockedCollection(self, path):
        lockedItem = self.lockedDownCollections.get(path)
        return lockedItem and lockedItem['state'] == 'locked'
Exemplo n.º 2
0
class Query(object):

    def __init__(self):
        self.searchValues = PersistentMapping()

    def getSearchSchema(self):
        return getUtility(IFindService).getSearchSchema()

    def getResultsSchema(self):
        return getUtility(IFindService).getResultsSchema()

    def getSearchFields(self):
        return self.getSearchSchema().getFields()

    def getResultFields(self):
        return self.getResultsSchema().getFields()

    def getCriterionValue(self, name):
        searchSchema = self.getSearchSchema()
        if searchSchema.hasField(name):
            return self.searchValues.get(name, None)
        else:
            raise ValueError(
                u'No field named %s defined in search schema' %
                name)

    def deleteCriterionValue(self, name):
        searchSchema = self.getSearchSchema()
        if searchSchema.hasField(name):
            if name in self.searchValues:
                del self.searchValues[name]

    def setCriterionValue(self, name, value):
        searchSchema = self.getSearchSchema()
        if searchSchema.hasField(name):
            self.searchValues[name] = value
        else:
            raise ValueError(
                u'No field named %s defined in search schema' %
                name)
Exemplo n.º 3
0
class Query(object):
    def __init__(self):
        self.searchValues = PersistentMapping()

    def getSearchSchema(self):
        return getUtility(IFindService).getSearchSchema()

    def getResultsSchema(self):
        return getUtility(IFindService).getResultsSchema()

    def getSearchFields(self):
        return self.getSearchSchema().getFields()

    def getResultFields(self):
        return self.getResultsSchema().getFields()

    def getCriterionValue(self, name):
        searchSchema = self.getSearchSchema()
        if searchSchema.hasField(name):
            return self.searchValues.get(name, None)
        else:
            raise ValueError('No field named %s defined in search schema' %
                             name)

    def deleteCriterionValue(self, name):
        searchSchema = self.getSearchSchema()
        if searchSchema.hasField(name):
            if name in self.searchValues:
                del self.searchValues[name]

    def setCriterionValue(self, name, value):
        searchSchema = self.getSearchSchema()
        if searchSchema.hasField(name):
            self.searchValues[name] = value
        else:
            raise ValueError('No field named %s defined in search schema' %
                             name)
Exemplo n.º 4
0
class SilvaFind(Query, Content, SimpleItem):
    __doc__ = _("""Silva Find is a powerful search feature that allows easy
        creation of search forms and result pages. Users can add a Find
        anywhere and define which fields to make searchable by site visitors
        and/or which fields to limit to a preset value. Users also can
        determine which fields should be displayed in the search results. All
        metadata sets/fields are supported.""")

    security = ClassSecurityInfo()

    meta_type = "Silva Find"
    grok.implements(IFind)
    silvaconf.icon('SilvaFind.png')

    def __init__(self, id):
        Content.__init__(self, id)
        Query.__init__(self)
        self.shownFields = PersistentMapping()
        self.shownResultsFields = PersistentMapping()
        # by default we only show fulltext search
        # and a couple of resultfields
        self.shownFields['fulltext'] = True
        self.shownResultsFields['link'] = True
        self.shownResultsFields['ranking'] = True
        self.shownResultsFields['resultcount'] = True
        self.shownResultsFields['icon'] = True
        self.shownResultsFields['date'] = True
        self.shownResultsFields['textsnippet'] = True
        self.shownResultsFields['thumbnail'] = True
        self.shownResultsFields['breadcrumbs'] = True

    # ACCESSORS
    security.declareProtected(SilvaPermissions.View, 'getPublicResultFields')
    def getPublicResultFields(self):
        return filter(lambda field: self.isResultShown(field.getName()),
                      self.getResultFields())

    security.declareProtected(SilvaPermissions.View, 'getPublicSearchFields')
    def getPublicSearchFields(self):
        return filter(lambda field: self.isCriterionShown(field.getName()),
                      self.getSearchFields())

    security.declareProtected(SilvaPermissions.View, 'isCriterionShown')
    def isCriterionShown(self, fieldName):
        return self.shownFields.get(fieldName, False)

    security.declareProtected(SilvaPermissions.View, 'isResultShown')
    def isResultShown(self, fieldName):
        return self.shownResultsFields.get(fieldName, False)

    security.declareProtected(SilvaPermissions.View, 'havePublicSearchFields')
    def havePublicSearchFields(self):
        # BBB map(bool) is here for previously non-boolean stored values
        return reduce(operator.or_, map(bool, self.shownFields.values()))

    security.declareProtected(SilvaPermissions.View, 'searchResults')
    def searchResults(self, request={}, validate=True):
        options = self.getSearchCriterias(request)
        if validate:
            queryEmpty = True
            for key, value in options.items():
                if key in ['path', 'meta_type']:
                    # these fields do not count as a real search query
                    # they are always there to filter unwanted results
                    continue
                if type(value) is unicode and value.strip():
                    queryEmpty = False
                    break
                elif type(value) is list:
                    queryEmpty = False
                    break
            query = options.get('fulltext', '').strip()
            if query and query[0] in ['?', '*']:
                raise ValueError(
                    _(u'Search query can not start with wildcard character.'))
            if queryEmpty:
                raise ValueError(
                    _(u'You need to fill at least one field in the search form.'))
        options['publication_status'] = ['public']
        catalog = self.get_root().service_catalog
        try:
            results = catalog.searchResults(options)
        except ParseError:
            raise ValueError(
                _(u'Search query contains only common or reserved words.'))

        return results

    def getSearchCriterias(self, request):
        options = {}
        for field in self.getSearchFields():
            name = field.getName()
            if (self.shownFields.get(name, False) or name == 'path'):
                queryPart = getMultiAdapter((field, self, request), IQueryPart)
                value = queryPart.getIndexValue()
                if value is None:
                    value = ''
                options[queryPart.getIndexId()] = value
        return options
class Concepts(SimpleItem, session_manager):
    """ Concepts """

    meta_type = CONCEPTS_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/concepts.gif'

    manage_options = (
        {'label':'Properties',      'action':'properties_html'},
        {'label':'Management',      'action':'concepts_html'},
        {'label':'Import',   'action':'import_html'},
        {'label':'Statistics',      'action':'statistics_html'},
        {'label':'Undo',            'action':'manage_UndoForm'},)

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id =         id
        self.title =      title
        self.concepts =   PersistentMapping()


    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')
    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for Concepts """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')


    #concepts management
    def __add_concept(self, concept_id):
        #create a new item
        item = ConceptItem(concept_id)
        self.concepts[concept_id] = item
        self.catalog.CatalogObject(item)

    def __update_concept(self, concept_id, old_concept_id):
        #modify an item
        item = self.concepts.get(old_concept_id)
        if item is not None:
            self.__delete_concept(old_concept_id)
        self.__add_concept(concept_id)

    def __delete_concept(self, ids):
        #delete 1 or more items
        ids = th_utils().utConvertToList(ids)
        collection = self.get_concepts()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]


    #concept constraints
    security.declareProtected(view_management_screens, 'getIdsList')
    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.concepts.keys()
        return th_utils().getIdsList(ids)


    #concepts getters
    def get_concepts(self):
        #get all concepts
        return self.concepts

    def get_concepts_sorted(self):
        #get all concepts sorted
        return th_utils().utSortObjsListByAttr(self.concepts.values(), 'concept_id', 0)

    def get_concept_by_id(self, concept_id):
        #get an item
        try:    return self.concepts[concept_id]
        except: return None

    def get_concept_item_data(self, concept_id):
        #get an item data
        item = self.get_concept_by_id(concept_id)
        if item is not None:
            return ['update', item.concept_id]
        else:
            return ['add', '']


    #concepts api
    security.declareProtected(view_management_screens, 'manage_add_concept')
    def manage_add_concept(self, concept_id='', REQUEST=None):
        """ manage concepts """
        if not concept_id: concept_id = th_utils().utGenRandomId()
        self.__add_concept(concept_id)
        if REQUEST:
            self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('concepts_html')

    security.declareProtected(view_management_screens, 'manage_update_concept')
    def manage_update_concept(self, concept_id='', old_concept_id='', REQUEST=None):
        """ update concept """
        self.__update_concept(concept_id, old_concept_id)
        if REQUEST:
            self.setSessionInfoTrans('Record updated.')
            REQUEST.RESPONSE.redirect('concepts_html')

    security.declareProtected(view_management_screens, 'manage_delete_concepts')
    def manage_delete_concepts(self, ids=[], delete_all='', REQUEST=None):
        """ delete concepts """
        del_count = 0
        #TODO: uncomment when Groups will be implemented
#        if delete_all:  ids = self.getIdsList(ids, 1)
#        else:           ids = self.getIdsList(ids)
        if delete_all:  ids = self.getIdsList(ids, 1)
        ids = th_utils().utConvertToList(ids)
        self.__delete_concept(ids)

        #delete all related data
        for concept_id in ids:
            #delete all related terms
            query = [('meta_type',TERM_ITEM_METATYPE),
                     ('concept_id',concept_id)]
            term_list = self.catalog.searchCatalog(query)
            term_folder = self.getTermsFolder()
            for term_ob in term_list:
                term_folder.manage_delete_terms(['%s###%s' % (term_ob.concept_id, term_ob.langcode)])
                del_count += 1

            #delete all related definitions
            query = [('meta_type',DEFINITION_ITEM_METATYPE),
                     ('concept_id',concept_id)]
            def_list = self.catalog.searchCatalog(query)
            def_folder = self.getDefinitionsFolder()
            for def_ob in def_list:
                def_folder.manage_delete_definitions(['%s###%s' % (def_ob.concept_id, def_ob.langcode)])
                del_count += 1

            #delete all related altterms
            query = [('meta_type',ALTTERM_ITEM_METATYPE),
                     ('concept_id',concept_id)]
            alt_list = self.catalog.searchCatalog(query)
            alt_folder = self.getAltTermsFolder()
            for alt_ob in alt_list:
                alt_folder.manage_delete_altterms(['%s###%s' % (alt_ob.concept_id, alt_ob.langcode)])
                del_count += 1

            #delete all related scopes
            query = [('meta_type',SCOPE_ITEM_METATYPE),
                     ('concept_id',concept_id)]
            scope_list = self.catalog.searchCatalog(query)
            scope_folder = self.getScopeNotesFolder()
            for scope_ob in scope_list:
                scope_folder.manage_delete_scopes(['%s###%s' % (scope_ob.concept_id, scope_ob.langcode)])
                del_count += 1

            #delete all related theme relations
            query = [('meta_type',THEME_RELATION_ITEM_METATYPE),
                     ('concept_id',concept_id)]
            threl_list = self.catalog.searchCatalog(query)
            threl_folder = self.getThemeRelationsFolder()
            for threl_ob in threl_list:
                threl_folder.manage_delete_threlations(['%s###%s' % (threl_ob.concept_id, threl_ob.theme_id)])
                del_count += 1

            #delete all related concept relations
            query = [('meta_type',CONCEPT_RELATION_ITEM_METATYPE),
                     ('concept_id',concept_id)]
            cprel_list = self.catalog.searchCatalog(query)
            cprel_folder = self.getConceptRelationsFolder()
            for cprel_ob in cprel_list:
                cprel_folder.manage_delete_relations(['%s###%s###%s' % (cprel_ob.concept_id, cprel_ob.relation_id, cprel_ob.relation_type)])
                del_count += 1

            query = [('meta_type',CONCEPT_RELATION_ITEM_METATYPE),
                     ('relation_id',concept_id)]
            cprel_list = self.catalog.searchCatalog(query)
            cprel_folder = self.getConceptRelationsFolder()
            for cprel_ob in cprel_list:
                cprel_folder.manage_delete_relations(['%s###%s###%s' % (cprel_ob.concept_id, cprel_ob.relation_id, cprel_ob.relation_type)])
                del_count += 1

        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.',
                ('${del_count} related records were deleted.', {'del_count': del_count}, ))
            REQUEST.RESPONSE.redirect('concepts_html')

    security.declareProtected(view_management_screens, 'getConceptItemData')
    def getConceptItemData(self):
        """ return a concept based on its ID """
        return self.get_concept_item_data(self.REQUEST.get('concept_id', None))


    #import related
    def skos_import(self, file, REQUEST=None):
        """ """
        parser = concept_parser()

        #parse the SKOS information
        chandler = parser.parseHeader(file)

        if chandler is None:
            if REQUEST:
                self.setSessionErrorsTrans('Parsing error. The file could not be parsed.')
                return REQUEST.RESPONSE.redirect('import_html')

        #get data
        concept_info = chandler.getConcepts()
        theme_relation_info = chandler.getThemes()

        #info
        count_concepts = 0
        count_themes_rel = 0

        #set Concepts
        for id, data in concept_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            if concept_id != '':
                count_concepts += 1
                self.__add_concept(concept_id)

        #set ThemeRelations
        for id, data in theme_relation_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            theme_id = data['theme_id'].encode('utf-8').split('/')[-1]
            if concept_id and theme_id:
                count_themes_rel += 1
                theme_relations_folder = self.getThemeRelationsFolder()
                theme_relations_folder.manage_add_threlation(concept_id, theme_id)

        if REQUEST:
            self.setSessionInfoTrans(['File imported successfully.',
                ('Concepts added: ${count_concepts}', {'count_concepts': count_concepts}, ),
                ('ThemeRelations added: ${count_themes_rel}', {'count_themes_rel': count_themes_rel}, )])
            return REQUEST.RESPONSE.redirect('import_html')


    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html =       PageTemplateFile("%s/zpt/Concepts/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'concepts_html')
    concepts_html =       PageTemplateFile("%s/zpt/Concepts/concepts" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html =       PageTemplateFile("%s/zpt/Concepts/statistics" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'import_html')
    import_html =           PageTemplateFile("%s/zpt/Concepts/import" % NAAYATHESAURUS_PATH, globals())
Exemplo n.º 6
0
class Terms(SimpleItem, session_manager):
    """ Terms """

    meta_type = TERMS_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/terms.gif'

    manage_options = (
        {
            'label': 'Properties',
            'action': 'properties_html'
        },
        {
            'label': 'Management',
            'action': 'terms_html'
        },
        {
            'label': 'Import',
            'action': 'import_html'
        },
        {
            'label': 'Statistics',
            'action': 'statistics_html'
        },
        {
            'label': 'Undo',
            'action': 'manage_UndoForm'
        },
    )

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id = id
        self.title = title
        self.terms = PersistentMapping()

    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')

    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for Terms """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')

    #terms management
    def __add_term(self, concept_id, langcode, concept_name, source_id):
        #create a new item
        item = TermItem(concept_id, langcode, concept_name, source_id)
        self.terms[(concept_id, langcode)] = item
        self.catalog.CatalogObject(item)

    def __update_term(self, concept_id, old_concept_id, langcode, old_langcode,
                      concept_name, source_id):
        #modify an item
        item = self.terms.get((old_concept_id, old_langcode))
        if item is not None:
            self.__delete_term((old_concept_id, old_langcode))
        self.__add_term(concept_id, langcode, concept_name, source_id)

    security.declareProtected(view_management_screens, 'update_source_id')

    def update_source_id(self, concept_id, langcode, source_id):
        """ update the source_id list """
        term_ob = self.get_term_by_id((concept_id, langcode))
        if term_ob.source_id:
            upd_source_id = "%s %s" % (term_ob.source_id, source_id)
        else:
            upd_source_id = source_id
        self.__update_term(concept_id, concept_id, langcode, langcode,
                           term_ob.concept_name, upd_source_id)

    def __delete_term(self, ids):
        #delete 1 or more items
        if type(ids) != type((1, 1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_terms()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]

    #term constraints
    security.declareProtected(view_management_screens, 'checkTerm')

    def checkTerm(self, concept_id):
        """ """
        if self.getConceptsFolder().get_concept_by_id(concept_id):
            return 1
        return 0

    security.declareProtected(view_management_screens, 'getIdsList')

    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.terms.keys()
        return th_utils().getIdsList(ids)

    #terms getters
    def get_terms(self):
        #get all terms
        return self.terms

    def get_terms_sorted(self):
        #get all terms sorted
        return th_utils().utSortObjsListByAttr(self.terms.values(),
                                               'concept_id', 0)

    def get_term_by_id(self, id):
        #get an item
        try:
            return self.terms[id]
        except:
            return None

    def get_term_item_data(self, concept_id, langcode, orig_concept_id,
                           orig_langcode, concept_name, source_id):
        #get an item data
        item = self.get_term_by_id((orig_concept_id, orig_langcode))
        if item is not None:
            if concept_name is None:
                concept_name = item.concept_name
            if source_id is None:
                source_id = item.source_id
            return [
                'update', concept_id, langcode, concept_name, source_id,
                orig_concept_id, orig_langcode
            ]
        else:
            return [
                'add', concept_id, langcode, concept_name, source_id, '', ''
            ]

    #terms api
    security.declareProtected(view_management_screens, 'manage_add_term')

    def manage_add_term(self,
                        concept_id='',
                        langcode='',
                        concept_name='',
                        source_id='',
                        REQUEST=None):
        """ manage terms """
        err = 0
        if self.checkTerm(concept_id):
            self.__add_term(concept_id, langcode, concept_name, source_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionLangcode(langcode)
                self.setSessionConceptName(concept_name)
                self.setSessionSourceId(source_id)
                self.setSessionErrorsTrans(
                    '${concept_id} is not a valid concept ID.',
                    concept_id=concept_id)
            else:
                self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('terms_html')

    security.declareProtected(view_management_screens, 'manage_update_term')

    def manage_update_term(self,
                           concept_id='',
                           old_concept_id='',
                           langcode='',
                           old_langcode='',
                           concept_name='',
                           source_id='',
                           REQUEST=None):
        """ update term """
        err = 0
        if self.checkTerm(concept_id):
            self.__update_term(concept_id, old_concept_id, langcode,
                               old_langcode, concept_name, source_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionLangcode(langcode)
                self.setSessionConceptName(concept_name)
                self.setSessionSourceId(source_id)
                self.setSessionErrorsTrans(
                    '${concept_id} is not a valid concept ID.',
                    concept_id=concept_id)
                REQUEST.RESPONSE.redirect(
                    'terms_html?concept_id=%s&langcode=%s' %
                    (old_concept_id, old_langcode))
            else:
                self.setSessionInfoTrans('Record updated.')
                REQUEST.RESPONSE.redirect('terms_html')

    security.declareProtected(view_management_screens, 'manage_delete_terms')

    def manage_delete_terms(self, ids=[], delete_all='', REQUEST=None):
        """ delete terms """
        if delete_all: ids = self.getIdsList(ids, 1)
        else: ids = self.getIdsList(ids)
        self.__delete_term(ids)

        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.')
            REQUEST.RESPONSE.redirect('terms_html')

    security.declareProtected(view_management_screens, 'getTermItemData')

    def getTermItemData(self):
        """ return a term based on its ID """
        if self.isSessionConceptId():
            concept_id = self.getSessionConceptId()
            langcode = self.getSessionLangcode()
            concept_name = self.getSessionConceptName()
            source_id = self.getSessionSourceId()
            orig_concept_id = self.REQUEST.get('concept_id', None)
            orig_langcode = self.REQUEST.get('langcode', None)
        else:
            concept_id = self.REQUEST.get('concept_id',
                                          self.getSessionConceptId())
            langcode = self.REQUEST.get('langcode', self.getSessionLangcode())
            concept_name = self.getSessionConceptName()
            source_id = self.getSessionSourceId()
            orig_concept_id = concept_id
            orig_langcode = langcode

        self.delSessionConceptId()
        self.delSessionLangcode()
        self.delSessionConceptName()
        self.delSessionSourceId()
        return self.get_term_item_data(concept_id, langcode, orig_concept_id,
                                       orig_langcode, concept_name, source_id)

    #import related
    def skos_import(self, file, langcode, REQUEST=None):
        """ """
        parser = term_parser()

        #parse the SKOS information
        chandler = parser.parseHeader(file)

        if chandler is None:
            if REQUEST:
                self.setSessionErrorsTrans(
                    'Parsing error. The file could not be parsed.')
                return REQUEST.RESPONSE.redirect('import_html')

        #get the target language
        skos_lang = chandler.getLanguage()
        if skos_lang: langcode = skos_lang.encode('utf-8')

        #get data
        pref_info = chandler.getPref()
        alt_info = chandler.getAlt()
        def_info = chandler.getDef()
        scope_info = chandler.getScope()
        src_info = chandler.getSrc()
        def_src_info = chandler.getDefSrc()

        #info
        count_terms = 0
        err_terms = []
        count_altterms = 0
        err_altterms = []
        count_def = 0
        err_defs = []
        count_scope = 0
        err_scope = []
        count_src = 0
        err_src = []
        count_def_src = 0
        err_def_src = []

        #set Terms
        for id, data in pref_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            if concept_id:
                concept_name = data['concept_name']
                source_id = ''
                if self.checkTerm(concept_id):
                    self.__add_term(concept_id, langcode, concept_name,
                                    source_id)
                    count_terms += 1
                else:
                    err_terms.append(concept_id)
            else:
                err_terms.append('None')

        #set Alternatives terms
        for id, data in alt_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            if concept_id:
                alt_terms_folder = self.getAltTermsFolder()
                alt_name = data['alt_name']
                if self.checkTerm(concept_id):
                    alt_terms_folder.manage_add_altterm(
                        concept_id, langcode, alt_name)
                    count_altterms += 1
                else:
                    err_altterms.append(concept_id)
            else:
                err_altterms.append('None')

        #set Definitions
        for id, data in def_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            if concept_id:
                definitions_folder = self.getDefinitionsFolder()
                definition = data['definition']
                if self.checkTerm(concept_id):
                    #TODO: implement source
                    definitions_folder.manage_add_definition(
                        concept_id, langcode, definition, '')
                    count_def += 1
                else:
                    err_defs.append(concept_id)
            else:
                err_defs.append('None')

        #set ScopeNotes
        for id, data in scope_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            if concept_id:
                scopenotes_folder = self.getScopeNotesFolder()
                scope_note = data['scope_note']
                if self.checkTerm(concept_id):
                    scopenotes_folder.manage_add_scope(concept_id, langcode,
                                                       scope_note)
                    count_scope += 1
                else:
                    err_scope.append(concept_id)
            else:
                err_scope.append('None')

        #set Terms sources
        for id, data in src_info.items():
            source_id = data['source_id']
            source_name = data['source_name']
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]

            if concept_id:
                if self.checkTerm(concept_id):
                    sources_folder = self.getSourceFolder()
                    #add source record
                    sources_folder.manage_add_source(source_id, source_name)
                    #update term record
                    self.update_source_id(concept_id, langcode, source_id)
                    count_src += 1
                else:
                    err_src.append(concept_id)
            else:
                err_src.append('None')

        #set Definitions sources
        for id, data in def_src_info.items():
            source_id = data['source_id']
            source_name = data['source_name']
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]

            if concept_id:
                if self.checkTerm(concept_id):
                    sources_folder = self.getSourceFolder()
                    definitions_folder = self.getDefinitionsFolder()
                    #add source record
                    sources_folder.manage_add_source(source_id, source_name)
                    #update definition record
                    definitions_folder.update_source_id(
                        concept_id, langcode, source_id)
                    count_def_src += 1
                else:
                    err_def_src.append(concept_id)
            else:
                err_def_src.append('None')

        if REQUEST:
            self.setSessionInfoTrans([
                'File imported successfully.',
                (
                    'Translations added: ${count_terms}',
                    {
                        'count_terms': count_terms
                    },
                ),
                (
                    'Alternative terms added: ${count_altterms}',
                    {
                        'count_altterms': count_altterms
                    },
                ),
                (
                    'Definitions added: ${count_def}',
                    {
                        'count_def': count_def
                    },
                ),
                (
                    'ScopeNotes added: ${count_scope}',
                    {
                        'count_scope': count_scope
                    },
                ),
                (
                    'Terms Sources added: ${count_src}',
                    {
                        'count_src': count_src
                    },
                ),
                (
                    'Definitions Sources added: ${count_def_src}',
                    {
                        'count_def_src': count_def_src
                    },
                ),
            ])
            msg_err = []
            if err_terms:
                msg_err.append((
                    'Translations not imported because the specified concept_id does not exist: ${err_terms}',
                    {
                        'err_terms':
                        th_utils().utJoinToString(err_terms, ', ')
                    },
                ))
            if err_altterms:
                msg_err.append((
                    'Alternative terms not imported because the specified concept_id does not exist: ${err_altterms}',
                    {
                        'err_altterms':
                        th_utils().utJoinToString(err_altterms, ', ')
                    },
                ))
            if err_defs:
                msg_err.append((
                    'Definitions not imported because the specified concept_id does not exist: ${err_defs}',
                    {
                        'err_defs': th_utils().utJoinToString(err_defs, ', ')
                    },
                ))
            if err_scope:
                msg_err.append((
                    'ScopeNotes not imported because the specified concept_id does not exist: ${err_scope}',
                    {
                        'err_scope':
                        th_utils().utJoinToString(err_scope, ', ')
                    },
                ))
            if err_src:
                msg_err.append((
                    'Term sources not imported because the specified concept_id does not exist: ${err_src}',
                    {
                        'err_src': th_utils().utJoinToString(err_src, ', ')
                    },
                ))
            if err_def_src:
                msg_err.append((
                    'Definition sources not imported because the specified concept_id does not exist: ${err_def_src}',
                    {
                        'err_def_src':
                        th_utils().utJoinToString(err_def_src, ', ')
                    },
                ))
            if msg_err:
                self.setSessionErrorsTrans(msg_err)
            return REQUEST.RESPONSE.redirect('import_html')

    #statistics
    def getAllTerms(self):
        query = [('meta_type', TERM_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getTermsNumber(self):
        return len(self.getAllTerms())

    def getTermsTransNumber(self):
        results = {}
        for term_ob in self.getAllTerms():
            try:
                tr_count = results[term_ob.langcode][0]
            except:
                tr_count = 0
            tr_count += 1

            try:
                src_count = results[term_ob.langcode][1]
            except:
                src_count = 0
            if term_ob.source_id: src_count += 1

            results[term_ob.langcode] = (tr_count, src_count)
        return results

    def getTermsWithSource(self):
        count = 0
        for term_ob in self.getAllTerms():
            if len(term_ob.source_id): count += 1
        return count

    def getEmptyTrans(self):
        empty_count = 0
        for term_ob in self.getAllTerms():
            if not term_ob.concept_name:
                empty_count += 1
        return empty_count

    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html = PageTemplateFile(
        "%s/zpt/Terms/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'terms_html')
    terms_html = PageTemplateFile("%s/zpt/Terms/terms" % NAAYATHESAURUS_PATH,
                                  globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html = PageTemplateFile(
        "%s/zpt/Terms/statistics" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'import_html')
    import_html = PageTemplateFile("%s/zpt/Terms/import" % NAAYATHESAURUS_PATH,
                                   globals())
Exemplo n.º 7
0
class Concepts(SimpleItem, session_manager):
    """ Concepts """

    meta_type = CONCEPTS_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/concepts.gif'

    manage_options = (
        {
            'label': 'Properties',
            'action': 'properties_html'
        },
        {
            'label': 'Management',
            'action': 'concepts_html'
        },
        {
            'label': 'Import',
            'action': 'import_html'
        },
        {
            'label': 'Statistics',
            'action': 'statistics_html'
        },
        {
            'label': 'Undo',
            'action': 'manage_UndoForm'
        },
    )

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id = id
        self.title = title
        self.concepts = PersistentMapping()

    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')

    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for Concepts """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')

    #concepts management
    def __add_concept(self, concept_id):
        #create a new item
        item = ConceptItem(concept_id)
        self.concepts[concept_id] = item
        self.catalog.CatalogObject(item)

    def __update_concept(self, concept_id, old_concept_id):
        #modify an item
        item = self.concepts.get(old_concept_id)
        if item is not None:
            self.__delete_concept(old_concept_id)
        self.__add_concept(concept_id)

    def __delete_concept(self, ids):
        #delete 1 or more items
        ids = th_utils().utConvertToList(ids)
        collection = self.get_concepts()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]

    #concept constraints
    security.declareProtected(view_management_screens, 'getIdsList')

    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.concepts.keys()
        return th_utils().getIdsList(ids)

    #concepts getters
    def get_concepts(self):
        #get all concepts
        return self.concepts

    def get_concepts_sorted(self):
        #get all concepts sorted
        return th_utils().utSortObjsListByAttr(self.concepts.values(),
                                               'concept_id', 0)

    def get_concept_by_id(self, concept_id):
        #get an item
        try:
            return self.concepts[concept_id]
        except:
            return None

    def get_concept_item_data(self, concept_id):
        #get an item data
        item = self.get_concept_by_id(concept_id)
        if item is not None:
            return ['update', item.concept_id]
        else:
            return ['add', '']

    #concepts api
    security.declareProtected(view_management_screens, 'manage_add_concept')

    def manage_add_concept(self, concept_id='', REQUEST=None):
        """ manage concepts """
        if not concept_id: concept_id = th_utils().utGenRandomId()
        self.__add_concept(concept_id)
        if REQUEST:
            self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('concepts_html')

    security.declareProtected(view_management_screens, 'manage_update_concept')

    def manage_update_concept(self,
                              concept_id='',
                              old_concept_id='',
                              REQUEST=None):
        """ update concept """
        self.__update_concept(concept_id, old_concept_id)
        if REQUEST:
            self.setSessionInfoTrans('Record updated.')
            REQUEST.RESPONSE.redirect('concepts_html')

    security.declareProtected(view_management_screens,
                              'manage_delete_concepts')

    def manage_delete_concepts(self, ids=[], delete_all='', REQUEST=None):
        """ delete concepts """
        del_count = 0
        #TODO: uncomment when Groups will be implemented
        #        if delete_all:  ids = self.getIdsList(ids, 1)
        #        else:           ids = self.getIdsList(ids)
        if delete_all: ids = self.getIdsList(ids, 1)
        ids = th_utils().utConvertToList(ids)
        self.__delete_concept(ids)

        #delete all related data
        for concept_id in ids:
            #delete all related terms
            query = [('meta_type', TERM_ITEM_METATYPE),
                     ('concept_id', concept_id)]
            term_list = self.catalog.searchCatalog(query)
            term_folder = self.getTermsFolder()
            for term_ob in term_list:
                term_folder.manage_delete_terms(
                    ['%s###%s' % (term_ob.concept_id, term_ob.langcode)])
                del_count += 1

            #delete all related definitions
            query = [('meta_type', DEFINITION_ITEM_METATYPE),
                     ('concept_id', concept_id)]
            def_list = self.catalog.searchCatalog(query)
            def_folder = self.getDefinitionsFolder()
            for def_ob in def_list:
                def_folder.manage_delete_definitions(
                    ['%s###%s' % (def_ob.concept_id, def_ob.langcode)])
                del_count += 1

            #delete all related altterms
            query = [('meta_type', ALTTERM_ITEM_METATYPE),
                     ('concept_id', concept_id)]
            alt_list = self.catalog.searchCatalog(query)
            alt_folder = self.getAltTermsFolder()
            for alt_ob in alt_list:
                alt_folder.manage_delete_altterms(
                    ['%s###%s' % (alt_ob.concept_id, alt_ob.langcode)])
                del_count += 1

            #delete all related scopes
            query = [('meta_type', SCOPE_ITEM_METATYPE),
                     ('concept_id', concept_id)]
            scope_list = self.catalog.searchCatalog(query)
            scope_folder = self.getScopeNotesFolder()
            for scope_ob in scope_list:
                scope_folder.manage_delete_scopes(
                    ['%s###%s' % (scope_ob.concept_id, scope_ob.langcode)])
                del_count += 1

            #delete all related theme relations
            query = [('meta_type', THEME_RELATION_ITEM_METATYPE),
                     ('concept_id', concept_id)]
            threl_list = self.catalog.searchCatalog(query)
            threl_folder = self.getThemeRelationsFolder()
            for threl_ob in threl_list:
                threl_folder.manage_delete_threlations(
                    ['%s###%s' % (threl_ob.concept_id, threl_ob.theme_id)])
                del_count += 1

            #delete all related concept relations
            query = [('meta_type', CONCEPT_RELATION_ITEM_METATYPE),
                     ('concept_id', concept_id)]
            cprel_list = self.catalog.searchCatalog(query)
            cprel_folder = self.getConceptRelationsFolder()
            for cprel_ob in cprel_list:
                cprel_folder.manage_delete_relations([
                    '%s###%s###%s' %
                    (cprel_ob.concept_id, cprel_ob.relation_id,
                     cprel_ob.relation_type)
                ])
                del_count += 1

            query = [('meta_type', CONCEPT_RELATION_ITEM_METATYPE),
                     ('relation_id', concept_id)]
            cprel_list = self.catalog.searchCatalog(query)
            cprel_folder = self.getConceptRelationsFolder()
            for cprel_ob in cprel_list:
                cprel_folder.manage_delete_relations([
                    '%s###%s###%s' %
                    (cprel_ob.concept_id, cprel_ob.relation_id,
                     cprel_ob.relation_type)
                ])
                del_count += 1

        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.', (
                '${del_count} related records were deleted.',
                {
                    'del_count': del_count
                },
            ))
            REQUEST.RESPONSE.redirect('concepts_html')

    security.declareProtected(view_management_screens, 'getConceptItemData')

    def getConceptItemData(self):
        """ return a concept based on its ID """
        return self.get_concept_item_data(self.REQUEST.get('concept_id', None))

    #import related
    def skos_import(self, file, REQUEST=None):
        """ """
        parser = concept_parser()

        #parse the SKOS information
        chandler = parser.parseHeader(file)

        if chandler is None:
            if REQUEST:
                self.setSessionErrorsTrans(
                    'Parsing error. The file could not be parsed.')
                return REQUEST.RESPONSE.redirect('import_html')

        #get data
        concept_info = chandler.getConcepts()
        theme_relation_info = chandler.getThemes()

        #info
        count_concepts = 0
        count_themes_rel = 0

        #set Concepts
        for id, data in concept_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            if concept_id != '':
                count_concepts += 1
                self.__add_concept(concept_id)

        #set ThemeRelations
        for id, data in theme_relation_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            theme_id = data['theme_id'].encode('utf-8').split('/')[-1]
            if concept_id and theme_id:
                count_themes_rel += 1
                theme_relations_folder = self.getThemeRelationsFolder()
                theme_relations_folder.manage_add_threlation(
                    concept_id, theme_id)

        if REQUEST:
            self.setSessionInfoTrans([
                'File imported successfully.',
                (
                    'Concepts added: ${count_concepts}',
                    {
                        'count_concepts': count_concepts
                    },
                ),
                (
                    'ThemeRelations added: ${count_themes_rel}',
                    {
                        'count_themes_rel': count_themes_rel
                    },
                )
            ])
            return REQUEST.RESPONSE.redirect('import_html')

    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html = PageTemplateFile(
        "%s/zpt/Concepts/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'concepts_html')
    concepts_html = PageTemplateFile(
        "%s/zpt/Concepts/concepts" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html = PageTemplateFile(
        "%s/zpt/Concepts/statistics" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'import_html')
    import_html = PageTemplateFile(
        "%s/zpt/Concepts/import" % NAAYATHESAURUS_PATH, globals())
Exemplo n.º 8
0
class ThemeRelations(SimpleItem, session_manager):
    """ ThemeRelations """

    meta_type = THEME_RELATION_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/theme_relations.gif'

    manage_options = (
        {
            'label': 'Properties',
            'action': 'properties_html'
        },
        {
            'label': 'Management',
            'action': 'theme_relations_html'
        },
        {
            'label': 'Statistics',
            'action': 'statistics_html'
        },
        {
            'label': 'Undo',
            'action': 'manage_UndoForm'
        },
    )

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id = id
        self.title = title
        self.theme_relations = PersistentMapping()

    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')

    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for ThemeRelations """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')

    #theme relations management
    def __add_threlation(self, concept_id, theme_id):
        #create a new item
        item = ThemeRelationItem(concept_id, theme_id)
        self.theme_relations[(concept_id, theme_id)] = item
        self.catalog.CatalogObject(item)

    def __update_threlation(self, concept_id, old_concept_id, theme_id,
                            old_theme_id):
        #modify an item
        item = self.theme_relations.get((old_concept_id, old_theme_id))
        if item is not None:
            self.__delete_threlation((old_concept_id, old_theme_id))
        self.__add_threlation(concept_id, theme_id)

    def __delete_threlation(self, ids):
        #delete 1 or more items
        if type(ids) != type((1, 1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_threlations()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]

    #theme relations constraints
    security.declareProtected(view_management_screens, 'checkThRel')

    def checkThRel(self, concept_id):
        """ """
        if self.getConceptsFolder().get_concept_by_id(concept_id):
            return 1
        return 0

    security.declareProtected(view_management_screens, 'getIdsList')

    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.theme_relations.keys()
        return th_utils().getIdsList(ids)

    security.declareProtected(view_management_screens, 'infoOnDelete')

    def infoOnDelete(self, ids, all=0):
        """ """
        results = []
        dic_cp = {}
        lst_cp = []

        for rel_id in self.getIdsList(ids, all):
            rel_ob = self.get_threlation_by_id(rel_id)
            try:
                lst_cp = dic_cp[rel_ob.concept_id]
            except:
                lst_cp = []
            lst_cp.append(rel_ob)
            dic_cp[rel_ob.concept_id] = lst_cp
            results.append(rel_ob)

        for concept_id in dic_cp.keys():
            query = [('meta_type', THEME_RELATION_ITEM_METATYPE),
                     ('concept_id', concept_id)]
            if len(dic_cp[concept_id]) == len(
                    self.catalog.searchCatalog(query)):
                dic_cp[concept_id] = 1
            else:
                dic_cp[concept_id] = 0

        return (results, dic_cp)

    #theme relations getters
    def get_threlations(self):
        #get all theme relations
        return self.theme_relations

    def get_threlations_sorted(self):
        #get all theme relations sorted
        return th_utils().utSortObjsListByAttr(self.theme_relations.values(),
                                               'concept_id', 0)

    def get_threlation_by_id(self, id):
        #get an item
        try:
            return self.theme_relations[id]
        except:
            return None

    def get_threlation_item_data(self, concept_id, theme_id, orig_concept_id,
                                 orig_theme_id):
        #get an item data
        item = self.get_threlation_by_id((orig_concept_id, orig_theme_id))
        if item is not None:
            return [
                'update', concept_id, theme_id, orig_concept_id, orig_theme_id
            ]
        else:
            return ['add', concept_id, theme_id, '', '']

    #themes api
    security.declareProtected(view_management_screens, 'manage_add_threlation')

    def manage_add_threlation(self, concept_id='', theme_id='', REQUEST=None):
        """ manage theme relations """
        err = 0
        if self.checkThRel(concept_id):
            self.__add_threlation(concept_id, theme_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionThemeId(theme_id)
                self.setSessionErrorsTrans(
                    '${concept_id} is not a valid concept ID.',
                    concept_id=concept_id)
            else:
                self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('theme_relations_html')

    security.declareProtected(view_management_screens,
                              'manage_update_threlation')

    def manage_update_threlation(self,
                                 concept_id='',
                                 old_concept_id='',
                                 theme_id='',
                                 old_theme_id='',
                                 REQUEST=None):
        """ update theme relation """
        err = 0
        if self.checkThRel(concept_id):
            self.__update_threlation(concept_id, old_concept_id, theme_id,
                                     old_theme_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionThemeId(theme_id)
                self.setSessionErrorsTrans(
                    '${concept_id} is not a valid concept ID.',
                    concept_id=concept_id)
                REQUEST.RESPONSE.redirect(
                    'theme_relations_html?concept_id=%s&theme_id=%s' %
                    (old_concept_id, old_theme_id))
            else:
                self.setSessionInfoTrans('Record updated.')
                REQUEST.RESPONSE.redirect('theme_relations_html')

    security.declareProtected(view_management_screens,
                              'manage_delete_threlations')

    def manage_delete_threlations(self, ids=[], REQUEST=None):
        """ delete theme relations """
        del_count = 0
        self.__delete_threlation(self.getIdsList(ids))

        query = [('meta_type', THEME_ITEM_METATYPE)]
        th_list = self.catalog.searchCatalog(query)
        for th_ob in th_list:
            query = [('meta_type', THEME_RELATION_ITEM_METATYPE),
                     ('theme_id', th_ob.theme_id)]
            if not self.catalog.searchCatalog(query):
                theme_folder = self.getThemesFolder()
                theme_folder.manage_delete_themes(
                    ['%s###%s' % (th_ob.theme_id, th_ob.langcode)])
                del_count += 1

        if REQUEST:
            self.setSessionInfoTrans([
                'Selected records deleted.',
                (
                    '${del_count} related records were deleted.',
                    {
                        'del_count': del_count
                    },
                )
            ])
            REQUEST.RESPONSE.redirect('theme_relations_html')

    security.declareProtected(view_management_screens, 'getThRelationItemData')

    def getThRelationItemData(self):
        """ return a theme relation based on its ID """
        if self.isSessionConceptId():
            concept_id = self.getSessionConceptId()
            theme_id = self.getSessionThemeId()
            orig_concept_id = self.REQUEST.get('concept_id', None)
            orig_theme_id = self.REQUEST.get('theme_id', None)
        else:
            concept_id = self.REQUEST.get('concept_id',
                                          self.getSessionConceptId())
            theme_id = self.REQUEST.get('theme_id', self.getSessionThemeId())
            orig_concept_id = concept_id
            orig_theme_id = theme_id

        self.delSessionConceptId()
        self.delSessionThemeId()
        return self.get_threlation_item_data(concept_id, theme_id,
                                             orig_concept_id, orig_theme_id)

    #statistics
    def getAllRelTh(self):
        query = [('meta_type', THEME_RELATION_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getRelThNumber(self):
        return len(self.getAllRelTh())

    def getDistinctThNumber(self):
        return len(self.getDistinctThemes())

    def getDistinctThemes(self):
        themes_list = []
        add_theme_id = themes_list.append

        query = [('meta_type', THEME_RELATION_ITEM_METATYPE)]
        th_relations = self.catalog.searchCatalog(query)

        for rel_ob in th_relations:
            theme_id = rel_ob.theme_id
            if theme_id not in themes_list: add_theme_id(theme_id)

        return themes_list

    def getUntranslatedThemes(self):
        th_count = 0
        for theme_id in self.getDistinctThemes():
            query = [('meta_type', THEME_ITEM_METATYPE),
                     ('theme_id', theme_id)]
            if not self.catalog.searchCatalog(query):
                th_count += 1
        return th_count

    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html = PageTemplateFile(
        "%s/zpt/ThemeRelations/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'theme_relations_html')
    theme_relations_html = PageTemplateFile(
        "%s/zpt/ThemeRelations/theme_relations" % NAAYATHESAURUS_PATH,
        globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html = PageTemplateFile(
        "%s/zpt/ThemeRelations/statistics" % NAAYATHESAURUS_PATH, globals())
Exemplo n.º 9
0
class ConceptRelations(SimpleItem, session_manager):
    """ ConceptRelations """

    meta_type = CONCEPT_RELATIONS_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/concept_relations.gif'

    manage_options = (
        {
            'label': 'Properties',
            'action': 'properties_html'
        },
        {
            'label': 'Management',
            'action': 'concept_relations_html'
        },
        {
            'label': 'Import',
            'action': 'import_html'
        },
        {
            'label': 'Statistics',
            'action': 'statistics_html'
        },
        {
            'label': 'Undo',
            'action': 'manage_UndoForm'
        },
    )

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id = id
        self.title = title
        self.concept_relations = PersistentMapping()

    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')

    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for ConceptRelations """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')

    #concept relations management
    def __add_relation(self, concept_id, relation_id, relation_type):
        #create a new item
        item = ConceptRelationsItem(concept_id, relation_id, relation_type)
        self.concept_relations[(concept_id, relation_id, relation_type)] = item
        self.catalog.CatalogObject(item)

    def __update_relation(self, concept_id, old_concept_id, relation_id,
                          old_relation_id, relation_type, old_relation_type):
        #modify an item
        l_old_id = (old_concept_id, old_relation_id, old_relation_type)
        item = self.concept_relations.get(l_old_id)
        if item is not None:
            self.__delete_relation(l_old_id)
        self.__add_relation(concept_id, relation_id, relation_type)

    def __delete_relation(self, ids):
        #delete 1 or more items
        if type(ids) != type((1, 1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_relations()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]

    #concept relations constraints
    security.declareProtected(view_management_screens, 'checkCpRel')

    def checkCpRel(self, concept_id):
        """ """
        if self.getConceptsFolder().get_concept_by_id(concept_id):
            return 1
        return 0

    security.declareProtected(view_management_screens, 'getIdsList')

    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.concept_relations.keys()
        return th_utils().getIdsList(ids)

    #relations getters
    def get_relations(self):
        #get all relations
        return self.concept_relations

    def get_relations_sorted(self):
        #get all relations sorted
        return th_utils().utSortObjsListByAttr(self.concept_relations.values(),
                                               'concept_id', 0)

    def get_relation_by_id(self, id):
        #get an item
        try:
            return self.concept_relations[id]
        except:
            return None

    def get_relations_item_data(self, concept_id, relation_id, relation_type,
                                orig_concept_id, orig_relation_id,
                                orig_relation_type):
        #get an item data
        item = self.get_relation_by_id(
            (orig_concept_id, orig_relation_id, orig_relation_type))
        if item is not None:
            return [
                'update', concept_id, relation_id, relation_type,
                orig_concept_id, orig_relation_id, orig_relation_type
            ]
        else:
            return ['add', concept_id, relation_id, relation_type, '', '', '']

    #concept relations api
    security.declareProtected(view_management_screens, 'manage_add_relation')

    def manage_add_relation(self,
                            concept_id='',
                            relation_id='',
                            relation_type='',
                            REQUEST=None):
        """ manage relations """
        err = 0
        if self.checkCpRel(concept_id) and self.checkCpRel(relation_id):
            self.__add_relation(concept_id, relation_id, relation_type)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionRelationId(relation_id)
                self.setSessionRelationType(relation_type)
                self.setSessionErrorsTrans(
                    '${concept_id} is not a valid concept ID.',
                    concept_id=concept_id)
            else:
                self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('concept_relations_html')

    security.declareProtected(view_management_screens,
                              'manage_update_relation')

    def manage_update_relation(self,
                               concept_id='',
                               old_concept_id='',
                               relation_id='',
                               old_relation_id='',
                               relation_type='',
                               old_relation_type='',
                               REQUEST=None):
        """ update relation """
        err = 0
        if self.checkCpRel(concept_id) and self.checkCpRel(relation_id):
            self.__update_relation(concept_id, old_concept_id, relation_id,
                                   old_relation_id, relation_type,
                                   old_relation_type)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionRelationId(relation_id)
                self.setSessionRelationType(relation_type)
                self.setSessionErrorsTrans(
                    '${concept_id} is not a valid concept ID.',
                    concept_id=concept_id)
                REQUEST.RESPONSE.redirect(
                    'concept_relations_html?concept_id=%s&relation_id=%s&relation_type=%s'
                    % (old_concept_id, old_relation_id, old_relation_type))
            else:
                self.setSessionInfoTrans('Record updated.')
                REQUEST.RESPONSE.redirect('concept_relations_html')

    security.declareProtected(view_management_screens,
                              'manage_delete_relations')

    def manage_delete_relations(self, ids=[], delete_all='', REQUEST=None):
        """ delete relations """
        if delete_all: ids = self.getIdsList(ids, 1)
        else: ids = self.getIdsList(ids)
        self.__delete_relation(ids)

        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.')
            REQUEST.RESPONSE.redirect('concept_relations_html')

    security.declareProtected(view_management_screens, 'getRelationItemData')

    def getRelationItemData(self):
        """ return a relation based on its ID """
        if self.isSessionConceptId():
            concept_id = self.getSessionConceptId()
            relation_id = self.getSessionRelationId()
            relation_type = self.getSessionRelationType()
            orig_concept_id = self.REQUEST.get('concept_id', None)
            orig_relation_id = self.REQUEST.get('relation_id', None)
            orig_relation_type = self.REQUEST.get('relation_type', None)
        else:
            concept_id = self.REQUEST.get('concept_id',
                                          self.getSessionConceptId())
            relation_id = self.REQUEST.get('relation_id',
                                           self.getSessionRelationId())
            relation_type = self.REQUEST.get('relation_type',
                                             self.getSessionRelationType())
            orig_concept_id = concept_id
            orig_relation_id = relation_id
            orig_relation_type = relation_type

        self.delSessionConceptId()
        self.delSessionRelationId()
        self.delSessionRelationType()
        return self.get_relations_item_data(concept_id, relation_id,
                                            relation_type, orig_concept_id,
                                            orig_relation_id,
                                            orig_relation_type)

    #import related
    def skos_import(self, file, REQUEST=None):
        """ """
        parser = relation_parser()

        #parse the SKOS information
        chandler = parser.parseHeader(file)

        if chandler is None:
            if REQUEST:
                self.setSessionErrorsTrans(
                    'Parsing error. The file could not be parsed.')
                return REQUEST.RESPONSE.redirect('import_html')

        #info
        count_rel = 0
        err_list = []

        #set data
        for data in chandler.getBody():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            relation_id = data['relation_id'].encode('utf-8').split('/')[-1]
            relation_type = data['relation_type']

            if concept_id:
                if self.checkCpRel(concept_id) and self.checkCpRel(
                        relation_id):
                    self.__add_relation(concept_id, relation_id, relation_type)
                    count_rel += 1
                else:
                    if not relation_id:
                        err_list.append((
                            '(${content_id}, None) - relation_id not specified',
                            {
                                'concept_id': concept_id
                            },
                        ))
                    else:
                        err_list.append((
                            '(${concept_id}, ${relation_id}) - at least one of the concept_id or relation_id does not exist',
                            {
                                'concept_id': concept_id,
                                'relation_id': relation_id
                            }))
            else:
                err_list.append('None - concept_id not specified')

        if REQUEST:
            self.setSessionInfoTrans([
                'File imported successfully.',
                (
                    'Translations added: ${count_rel}',
                    {
                        'count_rel': count_rel
                    },
                )
            ])
            if err_list:
                self.setSessionErrorsTrans([
                    'Relations not imported (by its (concept_id, relation_id)):',
                    err_list,
                ])
            return REQUEST.RESPONSE.redirect('import_html')

    #relation type related
    def getRelTypes(self):
        """ """
        return RELATION_TYPES

    def getRelTypesIDs(self):
        """ """
        return self.getRelTypes().keys()

    def getRelTypeByID(self, id):
        """ """
        return self.getRelTypes()[id]

    #statistics
    def getAllConRel(self):
        query = [('meta_type', CONCEPT_RELATION_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getConRelNumber(self):
        return len(self.getAllConRel())

    def getRelationsNumber(self):
        results = {}
        for conrel_ob in self.getAllConRel():
            try:
                br_count = results[1]
            except:
                br_count = 0
            try:
                nr_count = results[2]
            except:
                nr_count = 0
            try:
                re_count = results[3]
            except:
                re_count = 0

            if conrel_ob.relation_type == '1':
                results[1] = br_count + 1
            elif conrel_ob.relation_type == '2':
                results[2] = nr_count + 1
            elif conrel_ob.relation_type == '3':
                results[3] = re_count + 1

        return results

    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html = PageTemplateFile(
        "%s/zpt/ConceptRelations/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens,
                              'concept_relations_html')
    concept_relations_html = PageTemplateFile(
        "%s/zpt/ConceptRelations/concept_relations" % NAAYATHESAURUS_PATH,
        globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html = PageTemplateFile(
        "%s/zpt/ConceptRelations/statistics" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'import_html')
    import_html = PageTemplateFile(
        "%s/zpt/ConceptRelations/import" % NAAYATHESAURUS_PATH, globals())
Exemplo n.º 10
0
class Definitions(SimpleItem, session_manager):
    """ Definitions """

    meta_type = DEFINITIONS_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/definitions.gif'

    manage_options = (
        {
            'label': 'Properties',
            'action': 'properties_html'
        },
        {
            'label': 'Management',
            'action': 'definitions_html'
        },
        {
            'label': 'Statistics',
            'action': 'statistics_html'
        },
        {
            'label': 'Undo',
            'action': 'manage_UndoForm'
        },
    )

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id = id
        self.title = title
        self.definitions = PersistentMapping()

    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')

    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for Definitions """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')

    #definitions management
    def __add_definition(self, concept_id, langcode, definition, source_id):
        #create a new item
        item = DefinitionItem(concept_id, langcode, definition, source_id)
        self.definitions[(concept_id, langcode)] = item
        self.catalog.CatalogObject(item)

    def __update_definition(self, concept_id, old_concept_id, langcode,
                            old_langcode, definition, source_id):
        #modify an item
        item = self.definitions.get((old_concept_id, old_langcode))
        if item is not None:
            self.__delete_definition((old_concept_id, old_langcode))
        self.__add_definition(concept_id, langcode, definition, source_id)

    security.declareProtected(view_management_screens, 'update_source_id')

    def update_source_id(self, concept_id, langcode, source_id):
        """ update the source_id list """
        definition_ob = self.get_definition_by_id((concept_id, langcode))
        if definition_ob.source_id:
            upd_source_id = "%s %s" % (definition_ob.source_id, source_id)
        else:
            upd_source_id = source_id
        self.__update_definition(concept_id, concept_id, langcode, langcode,
                                 definition_ob.definition, upd_source_id)

    def __delete_definition(self, ids):
        #delete 1 or more items
        if type(ids) != type((1, 1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_definitions()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]

    #definition constraints
    security.declareProtected(view_management_screens, 'checkDefinition')

    def checkDefinition(self, concept_id):
        """ """
        if self.getConceptsFolder().get_concept_by_id(concept_id):
            return 1
        return 0

    security.declareProtected(view_management_screens, 'getIdsList')

    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.definitions.keys()
        return th_utils().getIdsList(ids)

    #definitions getters
    def get_definitions(self):
        #get all definitions
        return self.definitions

    def get_definitions_sorted(self):
        #get all definitions sorted
        return th_utils().utSortObjsListByAttr(self.definitions.values(),
                                               'concept_id', 0)

    def get_definition_by_id(self, id):
        #get an item
        try:
            return self.definitions[id]
        except:
            return None

    def get_definition_item_data(self, concept_id, langcode, orig_concept_id,
                                 orig_langcode, definition, source_id):
        #get an item data
        item = self.get_definition_by_id((orig_concept_id, orig_langcode))
        if item is not None:
            if definition is None:
                definition = item.definition
            if source_id is None:
                source_id = item.source_id
            return [
                'update', concept_id, langcode, definition, source_id,
                orig_concept_id, orig_langcode
            ]
        else:
            return ['add', concept_id, langcode, definition, source_id, '', '']

    #definitions api
    security.declareProtected(view_management_screens, 'manage_add_definition')

    def manage_add_definition(self,
                              concept_id='',
                              langcode='',
                              definition='',
                              source_id='',
                              REQUEST=None):
        """ manage definitions """
        err = 0
        if self.checkDefinition(concept_id):
            self.__add_definition(concept_id, langcode, definition, source_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionLangcode(langcode)
                self.setSessionDefinition(definition)
                self.setSessionSourceId(source_id)
                self.setSessionErrorsTrans(
                    '${concept_id} is not a valid concept ID.',
                    concept_id=concept_id)
            else:
                self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('definitions_html')

    security.declareProtected(view_management_screens,
                              'manage_update_definition')

    def manage_update_definition(self,
                                 concept_id='',
                                 old_concept_id='',
                                 langcode='',
                                 old_langcode='',
                                 definition='',
                                 source_id='',
                                 REQUEST=None):
        """ update definition """
        err = 0
        if self.checkDefinition(concept_id):
            self.__update_definition(concept_id, old_concept_id, langcode,
                                     old_langcode, definition, source_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionLangcode(langcode)
                self.setSessionDefinition(definition)
                self.setSessionSourceId(source_id)
                self.setSessionErrorsTrans(
                    '${concept_id} is not a valid concept ID.',
                    concept_id=concept_id)
                REQUEST.RESPONSE.redirect(
                    'definitions_html?concept_id=%s&langcode=%s' %
                    (old_concept_id, old_langcode))
            else:
                self.setSessionInfoTrans('Record updated.')
                REQUEST.RESPONSE.redirect('definitions_html')

    security.declareProtected(view_management_screens,
                              'manage_delete_definitions')

    def manage_delete_definitions(self, ids=[], delete_all='', REQUEST=None):
        """ delete definitions """
        if delete_all: ids = self.getIdsList(ids, 1)
        else: ids = self.getIdsList(ids)
        self.__delete_definition(ids)

        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.')
            REQUEST.RESPONSE.redirect('definitions_html')

    security.declareProtected(view_management_screens, 'getDefinitionItemData')

    def getDefinitionItemData(self):
        """ return a definition based on its ID """
        if self.isSessionConceptId():
            concept_id = self.getSessionConceptId()
            langcode = self.getSessionLangcode()
            definition = self.getSessionDefinition()
            source_id = self.getSessionSourceId()
            orig_concept_id = self.REQUEST.get('concept_id', None)
            orig_langcode = self.REQUEST.get('langcode', None)
        else:
            concept_id = self.REQUEST.get('concept_id',
                                          self.getSessionConceptId())
            langcode = self.REQUEST.get('langcode', self.getSessionLangcode())
            definition = self.getSessionDefinition()
            source_id = self.getSessionSourceId()
            orig_concept_id = concept_id
            orig_langcode = langcode

        self.delSessionConceptId()
        self.delSessionLangcode()
        self.delSessionDefinition()
        self.delSessionSourceId()
        return self.get_definition_item_data(concept_id, langcode,
                                             orig_concept_id, orig_langcode,
                                             definition, source_id)

        return self.get_definition_item_data(
            self.REQUEST.get('concept_id', None),
            self.REQUEST.get('langcode', None))

    #statistics
    def getAllDef(self):
        query = [('meta_type', DEFINITION_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getDefNumber(self):
        return len(self.getAllDef())

    def getDefTransNumber(self):
        results = {}
        for def_ob in self.getAllDef():
            try:
                tr_count = results[def_ob.langcode][0]
            except:
                tr_count = 0
            tr_count += 1

            try:
                src_count = results[def_ob.langcode][1]
            except:
                src_count = 0
            if def_ob.source_id: src_count += 1

            results[def_ob.langcode] = (tr_count, src_count)
        return results

    def getDefWithSource(self):
        count = 0
        for def_ob in self.getAllDef():
            if len(def_ob.source_id): count += 1
        return count

    def getEmptyDefs(self):
        empty_count = 0
        for def_ob in self.getAllDef():
            if not def_ob.definition:
                empty_count += 1
        return empty_count

    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html = PageTemplateFile(
        "%s/zpt/Definitions/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'definitions_html')
    definitions_html = PageTemplateFile(
        "%s/zpt/Definitions/definitions" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html = PageTemplateFile(
        "%s/zpt/Definitions/statistics" % NAAYATHESAURUS_PATH, globals())
Exemplo n.º 11
0
class Themes(SimpleItem, session_manager):
    """ Themes """

    meta_type = THEMES_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/themes.gif'

    manage_options = (
        {
            'label': 'Basic properties',
            'action': 'properties_html'
        },
        {
            'label': 'Management',
            'action': 'themes_html'
        },
        {
            'label': 'Import',
            'action': 'import_html'
        },
        {
            'label': 'Statistics',
            'action': 'statistics_html'
        },
        {
            'label': 'Undo',
            'action': 'manage_UndoForm'
        },
    )

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id = id
        self.title = title
        self.themes = PersistentMapping()

    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')

    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for Themes """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')

    #themes management
    def __add_theme(self, theme_id, langcode, name):
        #create a new item
        item = ThemeItem(theme_id, langcode, name)
        self.themes[(theme_id, langcode)] = item
        self.catalog.CatalogObject(item)

    def __update_theme(self, theme_id, old_theme_id, langcode, old_langcode,
                       name):
        #modify an item
        item = self.themes.get((old_theme_id, old_langcode))
        if item is not None:
            self.__delete_theme((old_theme_id, old_langcode))
        self.__add_theme(theme_id, langcode, name)

    def __delete_theme(self, ids):
        #delete 1 or more items
        if type(ids) != type((1, 1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_themes()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]

    #theme constraints
    security.declareProtected(view_management_screens, 'checkTheme')

    def checkTheme(self, theme_id):
        """ """
        if theme_id in self.getThemeRelationsFolder().getDistinctThemes():
            return 1
        return 0

    security.declareProtected(view_management_screens, 'getIdsList')

    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.themes.keys()
        return th_utils().getIdsList(ids)

    #themes getters
    def get_themes(self):
        #get all themes
        return self.themes

    def get_themes_sorted(self):
        #get all themes sorted
        return th_utils().utSortObjsListByAttr(self.themes.values(),
                                               'langcode', 0)

    def get_theme_by_id(self, id):
        #get an item
        try:
            return self.themes[id]
        except:
            return None

    def get_theme_item_data(self, theme_id, langcode, orig_theme_id,
                            orig_langcode, theme_name):
        #get an item data
        item = self.get_theme_by_id((orig_theme_id, orig_langcode))
        if item is not None:
            if theme_name is None:
                theme_name = item.theme_name
            return [
                'update', theme_id, langcode, theme_name, orig_theme_id,
                orig_langcode
            ]
        else:
            return ['add', theme_id, langcode, theme_name, '', '']

    #themes api
    security.declareProtected(view_management_screens, 'manage_add_theme')

    def manage_add_theme(self,
                         theme_id='',
                         langcode='',
                         theme_name='',
                         REQUEST=None):
        """ manage themes """
        err = 0
        if self.checkTheme(theme_id):
            self.__add_theme(theme_id, langcode, theme_name)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionThemeId(theme_id)
                self.setSessionLangcode(langcode)
                self.setSessionThemeName(theme_name)
                self.setSessionErrorsTrans(
                    '${theme_id} is not a valid theme ID.', theme_id=theme_id)
            else:
                self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('themes_html')

    security.declareProtected(view_management_screens, 'manage_update_theme')

    def manage_update_theme(self,
                            theme_id='',
                            old_theme_id='',
                            langcode='',
                            old_langcode='',
                            theme_name='',
                            REQUEST=None):
        """ update theme """
        err = 0
        if self.checkTheme(theme_id):
            self.__update_theme(theme_id, old_theme_id, langcode, old_langcode,
                                theme_name)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionThemeId(theme_id)
                self.setSessionLangcode(langcode)
                self.setSessionThemeName(theme_name)
                self.setSessionErrorsTrans(
                    '${theme_id} is not a valid theme ID.', theme_id=theme_id)
                REQUEST.RESPONSE.redirect(
                    'themes_html?theme_id=%s&langcode=%s' %
                    (old_theme_id, old_langcode))
            else:
                self.setSessionInfoTrans('Record updated.')
                REQUEST.RESPONSE.redirect('themes_html')

    security.declareProtected(view_management_screens, 'manage_delete_themes')

    def manage_delete_themes(self, ids=[], delete_all='', REQUEST=None):
        """ delete themes """
        if delete_all: ids = self.getIdsList(ids, 1)
        else: ids = self.getIdsList(ids)
        self.__delete_theme(ids)

        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.')
            REQUEST.RESPONSE.redirect('themes_html')

    security.declareProtected(view_management_screens, 'getThemeItemData')

    def getThemeItemData(self):
        """ return a theme based on its ID """
        if self.isSessionThemeId():
            theme_id = self.getSessionThemeId()
            langcode = self.getSessionLangcode()
            theme_name = self.getSessionThemeName()
            orig_theme_id = self.REQUEST.get('theme_id', None)
            orig_langcode = self.REQUEST.get('langcode', None)
        else:
            theme_id = self.REQUEST.get('theme_id', self.getSessionThemeId())
            langcode = self.REQUEST.get('langcode', self.getSessionLangcode())
            theme_name = self.getSessionThemeName()
            orig_theme_id = theme_id
            orig_langcode = langcode

        self.delSessionThemeId()
        self.delSessionLangcode()
        self.delSessionThemeName()
        return self.get_theme_item_data(theme_id, langcode, orig_theme_id,
                                        orig_langcode, theme_name)

    #import related
    def skos_import(self, file, langcode, REQUEST=None):
        """ """
        parser = theme_parser()

        #parse the SKOS information
        chandler = parser.parseHeader(file)

        if chandler is None:
            if REQUEST:
                self.setSessionErrorsTrans(
                    'Parsing error. The file could not be parsed.')
                return REQUEST.RESPONSE.redirect('import_html')

        #get the target language
        skos_lang = chandler.getLanguage()
        if skos_lang: target_language = skos_lang.encode('utf-8')
        else: target_language = langcode

        #get data
        body_info = chandler.getBody()

        #info
        count_themes = 0
        err_themes = []

        #set data
        for id, data in body_info.items():
            theme_id = id.encode('utf-8').split('/')[-1]

            if theme_id:
                if self.checkTheme(theme_id):
                    theme_name = data['name']
                    self.__add_theme(theme_id, target_language, theme_name)
                    count_themes += 1
                else:
                    err_themes.append(theme_id)
            else:
                err_themes.append('None')

        if REQUEST:
            self.setSessionInfoTrans([
                'File imported successfully.',
                (
                    'Translations added: ${count_themes}',
                    {
                        'count_themes': count_themes
                    },
                )
            ])
            if err_themes:
                self.setSessionErrorsTrans([
                    'Translations not imported (by its theme_id):',
                    (
                        'Errors: ${err_themes}',
                        {
                            'err_themes':
                            th_utils().utJoinToString(err_themes, ', ')
                        },
                    )
                ])
            return REQUEST.RESPONSE.redirect('import_html?msg=done')

    #statistics
    def getAllThemes(self):
        query = [('meta_type', THEME_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getThemesNumber(self):
        return len(self.getAllThemes())

    def getThemesTransNumber(self):
        results = {}
        for theme_ob in self.getAllThemes():
            try:
                tr_count = results[theme_ob.langcode]
            except:
                tr_count = 0

            results[theme_ob.langcode] = tr_count + 1
        return results

    def getEmptyTrans(self):
        empty_count = 0
        for theme_ob in self.getAllThemes():
            if not theme_ob.theme_name:
                empty_count += 1
        return empty_count

    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html = PageTemplateFile(
        "%s/zpt/Themes/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'themes_html')
    themes_html = PageTemplateFile(
        "%s/zpt/Themes/themes" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html = PageTemplateFile(
        "%s/zpt/Themes/statistics" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'import_html')
    import_html = PageTemplateFile(
        "%s/zpt/Themes/import" % NAAYATHESAURUS_PATH, globals())
class ThemeRelations(SimpleItem, session_manager):
    """ ThemeRelations """

    meta_type = THEME_RELATION_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/theme_relations.gif'

    manage_options = (
        {'label':'Properties',      'action':'properties_html'},
        {'label':'Management',      'action':'theme_relations_html'},
        {'label':'Statistics',      'action':'statistics_html'},
        {'label':'Undo',            'action':'manage_UndoForm'},)

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id =              id
        self.title =           title
        self.theme_relations = PersistentMapping()


    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')
    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for ThemeRelations """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')


    #theme relations management
    def __add_threlation(self, concept_id, theme_id):
        #create a new item
        item = ThemeRelationItem(concept_id, theme_id)
        self.theme_relations[(concept_id, theme_id)] = item
        self.catalog.CatalogObject(item)

    def __update_threlation(self, concept_id, old_concept_id, theme_id, old_theme_id):
        #modify an item
        item = self.theme_relations.get((old_concept_id, old_theme_id))
        if item is not None:
            self.__delete_threlation((old_concept_id, old_theme_id))
        self.__add_threlation(concept_id, theme_id)

    def __delete_threlation(self, ids):
        #delete 1 or more items
        if type(ids) != type((1,1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_threlations()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]


    #theme relations constraints
    security.declareProtected(view_management_screens, 'checkThRel')
    def checkThRel(self, concept_id):
        """ """
        if self.getConceptsFolder().get_concept_by_id(concept_id):
            return 1
        return 0

    security.declareProtected(view_management_screens, 'getIdsList')
    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.theme_relations.keys()
        return th_utils().getIdsList(ids)

    security.declareProtected(view_management_screens, 'infoOnDelete')
    def infoOnDelete(self, ids, all=0):
        """ """
        results = []
        dic_cp = {}
        lst_cp = []

        for rel_id in self.getIdsList(ids, all):
            rel_ob = self.get_threlation_by_id(rel_id)
            try:    lst_cp = dic_cp[rel_ob.concept_id]
            except: lst_cp= []
            lst_cp.append(rel_ob)
            dic_cp[rel_ob.concept_id] = lst_cp
            results.append(rel_ob)

        for concept_id in dic_cp.keys():
            query = [('meta_type',THEME_RELATION_ITEM_METATYPE),
                     ('concept_id',concept_id)]
            if len(dic_cp[concept_id]) == len(self.catalog.searchCatalog(query)):
                dic_cp[concept_id] = 1
            else:
                dic_cp[concept_id] = 0

        return (results, dic_cp)


    #theme relations getters
    def get_threlations(self):
        #get all theme relations
        return self.theme_relations

    def get_threlations_sorted(self):
        #get all theme relations sorted
        return th_utils().utSortObjsListByAttr(self.theme_relations.values(), 'concept_id', 0)

    def get_threlation_by_id(self, id):
        #get an item
        try:    return self.theme_relations[id]
        except: return None

    def get_threlation_item_data(self, concept_id, theme_id, orig_concept_id, orig_theme_id):
        #get an item data
        item = self.get_threlation_by_id((orig_concept_id, orig_theme_id))
        if item is not None:
            return ['update', concept_id, theme_id, orig_concept_id, orig_theme_id]
        else:
            return ['add', concept_id, theme_id, '', '']


    #themes api
    security.declareProtected(view_management_screens, 'manage_add_threlation')
    def manage_add_threlation(self, concept_id='', theme_id='', REQUEST=None):
        """ manage theme relations """
        err = 0
        if self.checkThRel(concept_id):
            self.__add_threlation(concept_id, theme_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionThemeId(theme_id)
                self.setSessionErrorsTrans('${concept_id} is not a valid concept ID.', concept_id=concept_id)
            else:
                self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('theme_relations_html')

    security.declareProtected(view_management_screens, 'manage_update_threlation')
    def manage_update_threlation(self, concept_id='', old_concept_id='', theme_id='', old_theme_id='', REQUEST=None):
        """ update theme relation """
        err = 0
        if self.checkThRel(concept_id):
            self.__update_threlation(concept_id, old_concept_id, theme_id, old_theme_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionThemeId(theme_id)
                self.setSessionErrorsTrans('${concept_id} is not a valid concept ID.', concept_id=concept_id)
                REQUEST.RESPONSE.redirect('theme_relations_html?concept_id=%s&theme_id=%s' % (old_concept_id, old_theme_id))
            else:
                self.setSessionInfoTrans('Record updated.')
                REQUEST.RESPONSE.redirect('theme_relations_html')

    security.declareProtected(view_management_screens, 'manage_delete_threlations')
    def manage_delete_threlations(self, ids=[], REQUEST=None):
        """ delete theme relations """
        del_count = 0
        self.__delete_threlation(self.getIdsList(ids))

        query = [('meta_type',THEME_ITEM_METATYPE)]
        th_list = self.catalog.searchCatalog(query)
        for th_ob in th_list:
            query = [('meta_type',THEME_RELATION_ITEM_METATYPE),
                     ('theme_id',th_ob.theme_id)]
            if not self.catalog.searchCatalog(query):
                theme_folder = self.getThemesFolder()
                theme_folder.manage_delete_themes(['%s###%s' % (th_ob.theme_id, th_ob.langcode)])
                del_count += 1

        if REQUEST:
            self.setSessionInfoTrans(['Selected records deleted.',
                ('${del_count} related records were deleted.', {'del_count': del_count}, )])
            REQUEST.RESPONSE.redirect('theme_relations_html')

    security.declareProtected(view_management_screens, 'getThRelationItemData')
    def getThRelationItemData(self):
        """ return a theme relation based on its ID """
        if self.isSessionConceptId():
            concept_id =        self.getSessionConceptId()
            theme_id =          self.getSessionThemeId()
            orig_concept_id =   self.REQUEST.get('concept_id', None)
            orig_theme_id =     self.REQUEST.get('theme_id', None)
        else:
            concept_id =        self.REQUEST.get('concept_id', self.getSessionConceptId())
            theme_id =          self.REQUEST.get('theme_id', self.getSessionThemeId())
            orig_concept_id =   concept_id
            orig_theme_id =     theme_id

        self.delSessionConceptId()
        self.delSessionThemeId()
        return self.get_threlation_item_data(concept_id, theme_id, orig_concept_id, orig_theme_id)


    #statistics
    def getAllRelTh(self):
        query = [('meta_type',THEME_RELATION_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getRelThNumber(self):
        return len(self.getAllRelTh())

    def getDistinctThNumber(self):
        return len(self.getDistinctThemes())

    def getDistinctThemes(self):
        themes_list = []
        add_theme_id = themes_list.append

        query = [('meta_type',THEME_RELATION_ITEM_METATYPE)]
        th_relations = self.catalog.searchCatalog(query)

        for rel_ob in th_relations:
            theme_id = rel_ob.theme_id
            if theme_id not in themes_list: add_theme_id(theme_id)

        return themes_list

    def getUntranslatedThemes(self):
        th_count = 0
        for theme_id in self.getDistinctThemes():
            query = [('meta_type',THEME_ITEM_METATYPE),
                     ('theme_id',theme_id)]
            if not self.catalog.searchCatalog(query):
                th_count += 1
        return th_count


    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html =       PageTemplateFile("%s/zpt/ThemeRelations/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'theme_relations_html')
    theme_relations_html =   PageTemplateFile("%s/zpt/ThemeRelations/theme_relations" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html =       PageTemplateFile("%s/zpt/ThemeRelations/statistics" % NAAYATHESAURUS_PATH, globals())
Exemplo n.º 13
0
class Source(SimpleItem):
    """ Source """

    meta_type = SOURCE_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/source.gif'

    manage_options = (
        {'label':'Properties',  'action':'properties_html'},
        {'label':'Management',      'action':'sources_html'},
        {'label':'Statistics',      'action':'statistics_html'},
        {'label':'Undo',        'action':'manage_UndoForm'},)

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id =       id
        self.title =    title
        self.sources =  PersistentMapping()


    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')
    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for Source """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')


    #sources management
    def __add_source(self, source_id, source_name):
        #create a new item
        item = SourceItem(source_id, source_name)
        self.sources[source_id] = item
        self.catalog.CatalogObject(item)

    def __update_source(self, source_id, old_source_id, source_name):
        #modify an item
        item = self.sources.get(old_source_id)
        if item is not None:
            self.__delete_source(old_source_id)
        self.__add_source(source_id, source_name)

    def __delete_source(self, ids):
        #delete 1 or more items
        ids = th_utils().utConvertToList(ids)
        collection = self.get_sources()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]


    #source constrints
    security.declareProtected(view_management_screens, 'getIdsList')
    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.sources.keys()
        return th_utils().getIdsList(ids)

    #sources getters
    def get_sources(self):
        #get all sources
        return self.sources

    def get_sources_sorted(self):
        #get all sources sorted
        return th_utils().utSortObjsListByAttr(self.sources.values(), 'source_id', 0)

    def get_source_by_id(self, id):
        #get an item
        try:    return self.sources[id]
        except: return None

    def get_source_item_data(self, id):
        #get an item data
        item = self.get_source_by_id(id)
        if item is not None: 
            return ['update', item.source_id, item.source_name]
        else:
            return ['add', '', '']


    #sources api
    security.declareProtected(view_management_screens, 'manage_add_source')
    def manage_add_source(self, source_id='', source_name='', REQUEST=None):
        """ manage sources """
        if not source_id: source_id = th_utils().utGenRandomId()
        self.__add_source(source_id, source_name)
        if REQUEST:
            self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('sources_html')

    security.declareProtected(view_management_screens, 'manage_update_source')
    def manage_update_source(self, source_id='', old_source_id='', source_name='', REQUEST=None):
        """ update source """
        self.__update_source(source_id, old_source_id, source_name)
        if REQUEST:
            self.setSessionInfoTrans('Record updated.')
            REQUEST.RESPONSE.redirect('sources_html')

    security.declareProtected(view_management_screens, 'manage_delete_sources')
    def manage_delete_sources(self, ids=[], delete_all='', REQUEST=None):
        """ delete sources """
        if delete_all:  ids = self.getIdsList(ids, 1)
        else:           ids = self.getIdsList(ids)
        self.__delete_source(ids)
        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.')
            REQUEST.RESPONSE.redirect('sources_html')

    security.declareProtected(view_management_screens, 'getSourceItemData')
    def getSourceItemData(self):
        """ return a source based on its ID """
        return self.get_source_item_data(self.REQUEST.get('source_id', None))


    #statistics
    def getAllSrc(self):
        query = [('meta_type',SOURCE_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getSrcNumber(self):
        return len(self.getAllSrc())


    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html =       PageTemplateFile("%s/zpt/Source/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'sources_html')
    sources_html =        PageTemplateFile("%s/zpt/Source/sources" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html =   PageTemplateFile("%s/zpt/Source/statistics" % NAAYATHESAURUS_PATH, globals())
Exemplo n.º 14
0
class SilvaFind(Query, Content, SimpleItem):
    __doc__ = _("""Silva Find is a powerful search feature that allows easy
        creation of search forms and result pages. Users can add a Find
        anywhere and define which fields to make searchable by site visitors
        and/or which fields to limit to a preset value. Users also can
        determine which fields should be displayed in the search results. All
        metadata sets/fields are supported.""")

    security = ClassSecurityInfo()

    meta_type = "Silva Find"
    grok.implements(IFind)
    silvaconf.icon('SilvaFind.png')

    def __init__(self, id):
        Content.__init__(self, id)
        Query.__init__(self)
        self.shownFields = PersistentMapping()
        self.shownResultsFields = PersistentMapping()
        # by default we only show fulltext search
        # and a couple of resultfields
        self.shownFields['fulltext'] = True
        self.shownResultsFields['link'] = True
        self.shownResultsFields['ranking'] = True
        self.shownResultsFields['resultcount'] = True
        self.shownResultsFields['icon'] = True
        self.shownResultsFields['date'] = True
        self.shownResultsFields['textsnippet'] = True
        self.shownResultsFields['thumbnail'] = True
        self.shownResultsFields['breadcrumbs'] = True

    # ACCESSORS
    security.declareProtected(SilvaPermissions.View, 'getPublicResultFields')

    def getPublicResultFields(self):
        return filter(lambda field: self.isResultShown(field.getName()),
                      self.getResultFields())

    security.declareProtected(SilvaPermissions.View, 'getPublicSearchFields')

    def getPublicSearchFields(self):
        return filter(lambda field: self.isCriterionShown(field.getName()),
                      self.getSearchFields())

    security.declareProtected(SilvaPermissions.View, 'isCriterionShown')

    def isCriterionShown(self, fieldName):
        return self.shownFields.get(fieldName, False)

    security.declareProtected(SilvaPermissions.View, 'isResultShown')

    def isResultShown(self, fieldName):
        return self.shownResultsFields.get(fieldName, False)

    security.declareProtected(SilvaPermissions.View, 'havePublicSearchFields')

    def havePublicSearchFields(self):
        # BBB map(bool) is here for previously non-boolean stored values
        return reduce(operator.or_, map(bool, self.shownFields.values()))

    security.declareProtected(SilvaPermissions.View, 'searchResults')

    def searchResults(self, request={}, validate=True):
        options = self.getSearchCriterias(request)
        if validate:
            queryEmpty = True
            for key, value in options.items():
                if key in ['path', 'meta_type']:
                    # these fields do not count as a real search query
                    # they are always there to filter unwanted results
                    continue
                if type(value) is unicode and value.strip():
                    queryEmpty = False
                    break
                elif type(value) is list:
                    queryEmpty = False
                    break
            query = options.get('fulltext', '').strip()
            if query and query[0] in ['?', '*']:
                raise ValueError(
                    _(u'Search query can not start with wildcard character.'))
            if queryEmpty:
                raise ValueError(
                    _(u'You need to fill at least one field in the search form.'
                      ))
        options['publication_status'] = ['public']
        catalog = self.get_root().service_catalog
        try:
            results = catalog.searchResults(options)
        except ParseError:
            raise ValueError(
                _(u'Search query contains only common or reserved words.'))

        return results

    def getSearchCriterias(self, request):
        options = {}
        for field in self.getSearchFields():
            name = field.getName()
            if (self.shownFields.get(name, False) or name == 'path'):
                queryPart = getMultiAdapter((field, self, request), IQueryPart)
                value = queryPart.getIndexValue()
                if value is None:
                    value = ''
                options[queryPart.getIndexId()] = value
        return options
Exemplo n.º 15
0
class Terms(SimpleItem, session_manager):
    """ Terms """

    meta_type = TERMS_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/terms.gif'

    manage_options = (
        {'label':'Properties',      'action':'properties_html'},
        {'label':'Management',      'action':'terms_html'},
        {'label':'Import',   'action':'import_html'},
        {'label':'Statistics',      'action':'statistics_html'},
        {'label':'Undo',            'action':'manage_UndoForm'},)

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id =       id
        self.title =    title
        self.terms =    PersistentMapping()


    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')
    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for Terms """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')


    #terms management
    def __add_term(self, concept_id, langcode, concept_name, source_id):
        #create a new item
        item = TermItem(concept_id, langcode, concept_name, source_id)
        self.terms[(concept_id, langcode)] = item
        self.catalog.CatalogObject(item)

    def __update_term(self, concept_id, old_concept_id, langcode, old_langcode,
                      concept_name, source_id):
        #modify an item
        item = self.terms.get((old_concept_id, old_langcode))
        if item is not None:
            self.__delete_term((old_concept_id, old_langcode))
        self.__add_term(concept_id, langcode, concept_name, source_id)

    security.declareProtected(view_management_screens, 'update_source_id')
    def update_source_id(self, concept_id, langcode, source_id):
        """ update the source_id list """
        term_ob = self.get_term_by_id((concept_id, langcode))
        if term_ob.source_id: upd_source_id = "%s %s" % (term_ob.source_id, source_id)
        else:                 upd_source_id = source_id
        self.__update_term(concept_id, concept_id, langcode, langcode, term_ob.concept_name, upd_source_id)

    def __delete_term(self, ids):
        #delete 1 or more items
        if type(ids) != type((1,1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_terms()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]


    #term constraints
    security.declareProtected(view_management_screens, 'checkTerm')
    def checkTerm(self, concept_id):
        """ """
        if self.getConceptsFolder().get_concept_by_id(concept_id):
            return 1
        return 0

    security.declareProtected(view_management_screens, 'getIdsList')
    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.terms.keys()
        return th_utils().getIdsList(ids)


    #terms getters
    def get_terms(self):
        #get all terms
        return self.terms

    def get_terms_sorted(self):
        #get all terms sorted
        return th_utils().utSortObjsListByAttr(self.terms.values(), 'concept_id', 0)

    def get_term_by_id(self, id):
        #get an item
        try:    return self.terms[id]
        except: return None

    def get_term_item_data(self, concept_id, langcode, orig_concept_id, orig_langcode, concept_name, source_id):
        #get an item data
        item = self.get_term_by_id((orig_concept_id, orig_langcode))
        if item is not None:
            if concept_name is None:
                concept_name = item.concept_name
            if source_id is None:
                source_id = item.source_id
            return ['update', concept_id, langcode, concept_name, source_id, orig_concept_id, orig_langcode]
        else:
            return ['add', concept_id, langcode, concept_name, source_id, '', '']


    #terms api
    security.declareProtected(view_management_screens, 'manage_add_term')
    def manage_add_term(self, concept_id='', langcode='', concept_name='', source_id='', REQUEST=None):
        """ manage terms """
        err = 0
        if self.checkTerm(concept_id):
            self.__add_term(concept_id, langcode, concept_name, source_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionLangcode(langcode)
                self.setSessionConceptName(concept_name)
                self.setSessionSourceId(source_id)
                self.setSessionErrorsTrans('${concept_id} is not a valid concept ID.', concept_id=concept_id)
            else:
                self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('terms_html')

    security.declareProtected(view_management_screens, 'manage_update_term')
    def manage_update_term(self, concept_id='', old_concept_id='', langcode='', old_langcode='',
                           concept_name='', source_id='', REQUEST=None):
        """ update term """
        err = 0
        if self.checkTerm(concept_id):
            self.__update_term(concept_id, old_concept_id, langcode, old_langcode, concept_name, source_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionLangcode(langcode)
                self.setSessionConceptName(concept_name)
                self.setSessionSourceId(source_id)
                self.setSessionErrorsTrans('${concept_id} is not a valid concept ID.', concept_id=concept_id)
                REQUEST.RESPONSE.redirect('terms_html?concept_id=%s&langcode=%s' % (old_concept_id, old_langcode))
            else:
                self.setSessionInfoTrans('Record updated.')
                REQUEST.RESPONSE.redirect('terms_html')

    security.declareProtected(view_management_screens, 'manage_delete_terms')
    def manage_delete_terms(self, ids=[], delete_all='', REQUEST=None):
        """ delete terms """
        if delete_all:  ids = self.getIdsList(ids, 1)
        else:           ids = self.getIdsList(ids)
        self.__delete_term(ids)

        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.')
            REQUEST.RESPONSE.redirect('terms_html')

    security.declareProtected(view_management_screens, 'getTermItemData')
    def getTermItemData(self):
        """ return a term based on its ID """
        if self.isSessionConceptId():
            concept_id =        self.getSessionConceptId()
            langcode =          self.getSessionLangcode()
            concept_name =      self.getSessionConceptName()
            source_id =         self.getSessionSourceId()
            orig_concept_id =   self.REQUEST.get('concept_id', None)
            orig_langcode =     self.REQUEST.get('langcode', None)
        else:
            concept_id =        self.REQUEST.get('concept_id', self.getSessionConceptId())
            langcode =          self.REQUEST.get('langcode', self.getSessionLangcode())
            concept_name =      self.getSessionConceptName()
            source_id =         self.getSessionSourceId()
            orig_concept_id =   concept_id
            orig_langcode =     langcode

        self.delSessionConceptId()
        self.delSessionLangcode()
        self.delSessionConceptName()
        self.delSessionSourceId()
        return self.get_term_item_data(concept_id, langcode, orig_concept_id, orig_langcode, concept_name, source_id)


    #import related
    def skos_import(self, file, langcode, REQUEST=None):
        """ """
        parser = term_parser()

        #parse the SKOS information
        chandler = parser.parseHeader(file)

        if chandler is None:
            if REQUEST:
                self.setSessionErrorsTrans('Parsing error. The file could not be parsed.')
                return REQUEST.RESPONSE.redirect('import_html')

        #get the target language
        skos_lang = chandler.getLanguage()
        if skos_lang:   langcode = skos_lang.encode('utf-8')

        #get data
        pref_info =     chandler.getPref()
        alt_info =      chandler.getAlt()
        def_info =      chandler.getDef()
        scope_info =    chandler.getScope()
        src_info =      chandler.getSrc()
        def_src_info =  chandler.getDefSrc()

        #info
        count_terms =   0
        err_terms =     []
        count_altterms = 0
        err_altterms =  []
        count_def =     0
        err_defs =      []
        count_scope =   0
        err_scope =     []
        count_src =     0
        err_src =       []
        count_def_src = 0
        err_def_src =   []

        #set Terms
        for id, data in pref_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            if concept_id:
                concept_name = data['concept_name']
                source_id = ''
                if self.checkTerm(concept_id):
                    self.__add_term(concept_id, langcode, concept_name, source_id)
                    count_terms += 1
                else:
                    err_terms.append(concept_id)
            else:
                err_terms.append('None')

        #set Alternatives terms
        for id, data in alt_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            if concept_id:
                alt_terms_folder = self.getAltTermsFolder()
                alt_name = data['alt_name']
                if self.checkTerm(concept_id):
                    alt_terms_folder.manage_add_altterm(concept_id, langcode, alt_name)
                    count_altterms += 1
                else:
                    err_altterms.append(concept_id)
            else:
                err_altterms.append('None')

        #set Definitions
        for id, data in def_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            if concept_id:
                definitions_folder = self.getDefinitionsFolder()
                definition = data['definition']
                if self.checkTerm(concept_id):
                    #TODO: implement source
                    definitions_folder.manage_add_definition(concept_id, langcode, definition, '')
                    count_def += 1
                else:
                    err_defs.append(concept_id)
            else:
                err_defs.append('None')

        #set ScopeNotes
        for id, data in scope_info.items():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            if concept_id:
                scopenotes_folder = self.getScopeNotesFolder()
                scope_note = data['scope_note']
                if self.checkTerm(concept_id):
                    scopenotes_folder.manage_add_scope(concept_id, langcode, scope_note)
                    count_scope += 1
                else:
                    err_scope.append(concept_id)
            else:
                err_scope.append('None')

        #set Terms sources
        for id, data in src_info.items():
            source_id =     data['source_id']
            source_name =   data['source_name']
            concept_id =    data['concept_id'].encode('utf-8').split('/')[-1]

            if concept_id:
                if self.checkTerm(concept_id):
                    sources_folder = self.getSourceFolder()
                    #add source record
                    sources_folder.manage_add_source(source_id, source_name)
                    #update term record
                    self.update_source_id(concept_id, langcode, source_id)
                    count_src += 1
                else:
                    err_src.append(concept_id)
            else:
                err_src.append('None')

        #set Definitions sources
        for id, data in def_src_info.items():
            source_id =     data['source_id']
            source_name =   data['source_name']
            concept_id =    data['concept_id'].encode('utf-8').split('/')[-1]

            if concept_id:
                if self.checkTerm(concept_id):
                    sources_folder = self.getSourceFolder()
                    definitions_folder = self.getDefinitionsFolder()
                    #add source record
                    sources_folder.manage_add_source(source_id, source_name)
                    #update definition record
                    definitions_folder.update_source_id(concept_id, langcode, source_id)
                    count_def_src += 1
                else:
                    err_def_src.append(concept_id)
            else:
                err_def_src.append('None')

        if REQUEST:
            self.setSessionInfoTrans(['File imported successfully.',
                ('Translations added: ${count_terms}', {'count_terms':  count_terms}, ),
                ('Alternative terms added: ${count_altterms}', {'count_altterms':  count_altterms}, ),
                ('Definitions added: ${count_def}', {'count_def':  count_def}, ),
                ('ScopeNotes added: ${count_scope}', {'count_scope':  count_scope}, ),
                ('Terms Sources added: ${count_src}', {'count_src':  count_src}, ),
                ('Definitions Sources added: ${count_def_src}', {'count_def_src':  count_def_src}, ),
            ])
            msg_err = []
            if err_terms:
                msg_err.append(('Translations not imported because the specified concept_id does not exist: ${err_terms}',
                    {'err_terms': th_utils().utJoinToString(err_terms, ', ')}, ))
            if err_altterms:
                msg_err.append(('Alternative terms not imported because the specified concept_id does not exist: ${err_altterms}',
                    {'err_altterms': th_utils().utJoinToString(err_altterms, ', ')}, ))
            if err_defs:
                msg_err.append(('Definitions not imported because the specified concept_id does not exist: ${err_defs}',
                    {'err_defs': th_utils().utJoinToString(err_defs, ', ')}, ))
            if err_scope:
                msg_err.append(('ScopeNotes not imported because the specified concept_id does not exist: ${err_scope}',
                    {'err_scope': th_utils().utJoinToString(err_scope, ', ')}, ))
            if err_src:
                msg_err.append(('Term sources not imported because the specified concept_id does not exist: ${err_src}',
                    {'err_src': th_utils().utJoinToString(err_src, ', ')}, ))
            if err_def_src:
                msg_err.append(('Definition sources not imported because the specified concept_id does not exist: ${err_def_src}',
                    {'err_def_src': th_utils().utJoinToString(err_def_src, ', ')}, ))
            if msg_err:
                self.setSessionErrorsTrans(msg_err)
            return REQUEST.RESPONSE.redirect('import_html')


    #statistics
    def getAllTerms(self):
        query = [('meta_type',TERM_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getTermsNumber(self):
        return len(self.getAllTerms())

    def getTermsTransNumber(self):
        results = {}
        for term_ob in self.getAllTerms():
            try:    tr_count = results[term_ob.langcode][0]
            except: tr_count = 0
            tr_count += 1

            try:    src_count = results[term_ob.langcode][1]
            except: src_count = 0
            if term_ob.source_id: src_count += 1

            results[term_ob.langcode] = (tr_count, src_count)
        return results

    def getTermsWithSource(self):
        count = 0
        for term_ob in self.getAllTerms():
            if len(term_ob.source_id): count += 1
        return count

    def getEmptyTrans(self):
        empty_count = 0
        for term_ob in self.getAllTerms():
            if not term_ob.concept_name:
                empty_count += 1
        return empty_count


    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html =   PageTemplateFile("%s/zpt/Terms/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'terms_html')
    terms_html =        PageTemplateFile("%s/zpt/Terms/terms" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html =   PageTemplateFile("%s/zpt/Terms/statistics" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'import_html')
    import_html =       PageTemplateFile("%s/zpt/Terms/import" % NAAYATHESAURUS_PATH, globals())
class Themes(SimpleItem, session_manager):
    """ Themes """

    meta_type = THEMES_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = "misc_/NaayaThesaurus/themes.gif"

    manage_options = (
        {"label": "Basic properties", "action": "properties_html"},
        {"label": "Management", "action": "themes_html"},
        {"label": "Import", "action": "import_html"},
        {"label": "Statistics", "action": "statistics_html"},
        {"label": "Undo", "action": "manage_UndoForm"},
    )

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id = id
        self.title = title
        self.themes = PersistentMapping()

    # basic properties
    security.declareProtected(view_management_screens, "manageBasicProperties")

    def manageBasicProperties(self, title="", REQUEST=None):
        """ manage basic properties for Themes """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans("Saved changes.")
            return REQUEST.RESPONSE.redirect("properties_html")

    # themes management
    def __add_theme(self, theme_id, langcode, name):
        # create a new item
        item = ThemeItem(theme_id, langcode, name)
        self.themes[(theme_id, langcode)] = item
        self.catalog.CatalogObject(item)

    def __update_theme(self, theme_id, old_theme_id, langcode, old_langcode, name):
        # modify an item
        item = self.themes.get((old_theme_id, old_langcode))
        if item is not None:
            self.__delete_theme((old_theme_id, old_langcode))
        self.__add_theme(theme_id, langcode, name)

    def __delete_theme(self, ids):
        # delete 1 or more items
        if type(ids) != type((1, 1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_themes()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]

    # theme constraints
    security.declareProtected(view_management_screens, "checkTheme")

    def checkTheme(self, theme_id):
        """ """
        if theme_id in self.getThemeRelationsFolder().getDistinctThemes():
            return 1
        return 0

    security.declareProtected(view_management_screens, "getIdsList")

    def getIdsList(self, ids, all=0):
        """ """
        if all:
            return self.themes.keys()
        return th_utils().getIdsList(ids)

    # themes getters
    def get_themes(self):
        # get all themes
        return self.themes

    def get_themes_sorted(self):
        # get all themes sorted
        return th_utils().utSortObjsListByAttr(self.themes.values(), "langcode", 0)

    def get_theme_by_id(self, id):
        # get an item
        try:
            return self.themes[id]
        except:
            return None

    def get_theme_item_data(self, theme_id, langcode, orig_theme_id, orig_langcode, theme_name):
        # get an item data
        item = self.get_theme_by_id((orig_theme_id, orig_langcode))
        if item is not None:
            if theme_name is None:
                theme_name = item.theme_name
            return ["update", theme_id, langcode, theme_name, orig_theme_id, orig_langcode]
        else:
            return ["add", theme_id, langcode, theme_name, "", ""]

    # themes api
    security.declareProtected(view_management_screens, "manage_add_theme")

    def manage_add_theme(self, theme_id="", langcode="", theme_name="", REQUEST=None):
        """ manage themes """
        err = 0
        if self.checkTheme(theme_id):
            self.__add_theme(theme_id, langcode, theme_name)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionThemeId(theme_id)
                self.setSessionLangcode(langcode)
                self.setSessionThemeName(theme_name)
                self.setSessionErrorsTrans("${theme_id} is not a valid theme ID.", theme_id=theme_id)
            else:
                self.setSessionInfoTrans("Record added.")
            REQUEST.RESPONSE.redirect("themes_html")

    security.declareProtected(view_management_screens, "manage_update_theme")

    def manage_update_theme(
        self, theme_id="", old_theme_id="", langcode="", old_langcode="", theme_name="", REQUEST=None
    ):
        """ update theme """
        err = 0
        if self.checkTheme(theme_id):
            self.__update_theme(theme_id, old_theme_id, langcode, old_langcode, theme_name)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionThemeId(theme_id)
                self.setSessionLangcode(langcode)
                self.setSessionThemeName(theme_name)
                self.setSessionErrorsTrans("${theme_id} is not a valid theme ID.", theme_id=theme_id)
                REQUEST.RESPONSE.redirect("themes_html?theme_id=%s&langcode=%s" % (old_theme_id, old_langcode))
            else:
                self.setSessionInfoTrans("Record updated.")
                REQUEST.RESPONSE.redirect("themes_html")

    security.declareProtected(view_management_screens, "manage_delete_themes")

    def manage_delete_themes(self, ids=[], delete_all="", REQUEST=None):
        """ delete themes """
        if delete_all:
            ids = self.getIdsList(ids, 1)
        else:
            ids = self.getIdsList(ids)
        self.__delete_theme(ids)

        if REQUEST:
            self.setSessionInfoTrans("Selected records deleted.")
            REQUEST.RESPONSE.redirect("themes_html")

    security.declareProtected(view_management_screens, "getThemeItemData")

    def getThemeItemData(self):
        """ return a theme based on its ID """
        if self.isSessionThemeId():
            theme_id = self.getSessionThemeId()
            langcode = self.getSessionLangcode()
            theme_name = self.getSessionThemeName()
            orig_theme_id = self.REQUEST.get("theme_id", None)
            orig_langcode = self.REQUEST.get("langcode", None)
        else:
            theme_id = self.REQUEST.get("theme_id", self.getSessionThemeId())
            langcode = self.REQUEST.get("langcode", self.getSessionLangcode())
            theme_name = self.getSessionThemeName()
            orig_theme_id = theme_id
            orig_langcode = langcode

        self.delSessionThemeId()
        self.delSessionLangcode()
        self.delSessionThemeName()
        return self.get_theme_item_data(theme_id, langcode, orig_theme_id, orig_langcode, theme_name)

    # import related
    def skos_import(self, file, langcode, REQUEST=None):
        """ """
        parser = theme_parser()

        # parse the SKOS information
        chandler = parser.parseHeader(file)

        if chandler is None:
            if REQUEST:
                self.setSessionErrorsTrans("Parsing error. The file could not be parsed.")
                return REQUEST.RESPONSE.redirect("import_html")

        # get the target language
        skos_lang = chandler.getLanguage()
        if skos_lang:
            target_language = skos_lang.encode("utf-8")
        else:
            target_language = langcode

        # get data
        body_info = chandler.getBody()

        # info
        count_themes = 0
        err_themes = []

        # set data
        for id, data in body_info.items():
            theme_id = id.encode("utf-8").split("/")[-1]

            if theme_id:
                if self.checkTheme(theme_id):
                    theme_name = data["name"]
                    self.__add_theme(theme_id, target_language, theme_name)
                    count_themes += 1
                else:
                    err_themes.append(theme_id)
            else:
                err_themes.append("None")

        if REQUEST:
            self.setSessionInfoTrans(
                ["File imported successfully.", ("Translations added: ${count_themes}", {"count_themes": count_themes})]
            )
            if err_themes:
                self.setSessionErrorsTrans(
                    [
                        "Translations not imported (by its theme_id):",
                        ("Errors: ${err_themes}", {"err_themes": th_utils().utJoinToString(err_themes, ", ")}),
                    ]
                )
            return REQUEST.RESPONSE.redirect("import_html?msg=done")

    # statistics
    def getAllThemes(self):
        query = [("meta_type", THEME_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getThemesNumber(self):
        return len(self.getAllThemes())

    def getThemesTransNumber(self):
        results = {}
        for theme_ob in self.getAllThemes():
            try:
                tr_count = results[theme_ob.langcode]
            except:
                tr_count = 0

            results[theme_ob.langcode] = tr_count + 1
        return results

    def getEmptyTrans(self):
        empty_count = 0
        for theme_ob in self.getAllThemes():
            if not theme_ob.theme_name:
                empty_count += 1
        return empty_count

    # management tabs
    security.declareProtected(view_management_screens, "properties_html")
    properties_html = PageTemplateFile("%s/zpt/Themes/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, "themes_html")
    themes_html = PageTemplateFile("%s/zpt/Themes/themes" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, "statistics_html")
    statistics_html = PageTemplateFile("%s/zpt/Themes/statistics" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, "import_html")
    import_html = PageTemplateFile("%s/zpt/Themes/import" % NAAYATHESAURUS_PATH, globals())
class Definitions(SimpleItem, session_manager):
    """ Definitions """

    meta_type = DEFINITIONS_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/definitions.gif'

    manage_options = (
        {'label':'Properties',      'action':'properties_html'},
        {'label':'Management',      'action':'definitions_html'},
        {'label':'Statistics',      'action':'statistics_html'},
        {'label':'Undo',            'action':'manage_UndoForm'},)

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id =           id
        self.title =        title
        self.definitions =  PersistentMapping()


    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')
    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for Definitions """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')


    #definitions management
    def __add_definition(self, concept_id, langcode, definition, source_id):
        #create a new item
        item = DefinitionItem(concept_id, langcode, definition, source_id)
        self.definitions[(concept_id, langcode)] = item
        self.catalog.CatalogObject(item)

    def __update_definition(self, concept_id, old_concept_id, langcode, old_langcode,
                          definition, source_id):
        #modify an item
        item = self.definitions.get((old_concept_id, old_langcode))
        if item is not None:
            self.__delete_definition((old_concept_id, old_langcode))
        self.__add_definition(concept_id, langcode, definition, source_id)

    security.declareProtected(view_management_screens, 'update_source_id')
    def update_source_id(self, concept_id, langcode, source_id):
        """ update the source_id list """
        definition_ob = self.get_definition_by_id((concept_id, langcode))
        if definition_ob.source_id: upd_source_id = "%s %s" % (definition_ob.source_id, source_id)
        else:                       upd_source_id = source_id
        self.__update_definition(concept_id, concept_id, langcode, langcode, definition_ob.definition, upd_source_id)

    def __delete_definition(self, ids):
        #delete 1 or more items
        if type(ids) != type((1,1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_definitions()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]


    #definition constraints
    security.declareProtected(view_management_screens, 'checkDefinition')
    def checkDefinition(self, concept_id):
        """ """
        if self.getConceptsFolder().get_concept_by_id(concept_id):
            return 1
        return 0

    security.declareProtected(view_management_screens, 'getIdsList')
    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.definitions.keys()
        return th_utils().getIdsList(ids)


    #definitions getters
    def get_definitions(self):
        #get all definitions
        return self.definitions

    def get_definitions_sorted(self):
        #get all definitions sorted
        return th_utils().utSortObjsListByAttr(self.definitions.values(), 'concept_id', 0)

    def get_definition_by_id(self, id):
        #get an item
        try:    return self.definitions[id]
        except: return None

    def get_definition_item_data(self, concept_id, langcode, orig_concept_id, orig_langcode, definition, source_id):
        #get an item data
        item = self.get_definition_by_id((orig_concept_id, orig_langcode))
        if item is not None:
            if definition is None:
                definition = item.definition
            if source_id is None:
                source_id = item.source_id
            return ['update', concept_id, langcode, definition, source_id, orig_concept_id, orig_langcode]
        else:
            return ['add', concept_id, langcode, definition, source_id, '', '']


    #definitions api
    security.declareProtected(view_management_screens, 'manage_add_definition')
    def manage_add_definition(self, concept_id='', langcode='', definition='', source_id='', REQUEST=None):
        """ manage definitions """
        err = 0
        if self.checkDefinition(concept_id):
            self.__add_definition(concept_id, langcode, definition, source_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionLangcode(langcode)
                self.setSessionDefinition(definition)
                self.setSessionSourceId(source_id)
                self.setSessionErrorsTrans('${concept_id} is not a valid concept ID.', concept_id=concept_id)
            else:
                self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('definitions_html')

    security.declareProtected(view_management_screens, 'manage_update_definition')
    def manage_update_definition(self, concept_id='', old_concept_id='', langcode='', old_langcode='',
                                 definition='', source_id='', REQUEST=None):
        """ update definition """
        err = 0
        if self.checkDefinition(concept_id):
            self.__update_definition(concept_id, old_concept_id, langcode, old_langcode, definition, source_id)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionLangcode(langcode)
                self.setSessionDefinition(definition)
                self.setSessionSourceId(source_id)
                self.setSessionErrorsTrans('${concept_id} is not a valid concept ID.', concept_id=concept_id)
                REQUEST.RESPONSE.redirect('definitions_html?concept_id=%s&langcode=%s' % (old_concept_id, old_langcode))
            else:
                self.setSessionInfoTrans('Record updated.')
                REQUEST.RESPONSE.redirect('definitions_html')

    security.declareProtected(view_management_screens, 'manage_delete_definitions')
    def manage_delete_definitions(self, ids=[], delete_all='', REQUEST=None):
        """ delete definitions """
        if delete_all:  ids = self.getIdsList(ids, 1)
        else:           ids = self.getIdsList(ids)
        self.__delete_definition(ids)

        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.')
            REQUEST.RESPONSE.redirect('definitions_html')

    security.declareProtected(view_management_screens, 'getDefinitionItemData')
    def getDefinitionItemData(self):
        """ return a definition based on its ID """
        if self.isSessionConceptId():
            concept_id =        self.getSessionConceptId()
            langcode =          self.getSessionLangcode()
            definition =        self.getSessionDefinition()
            source_id =         self.getSessionSourceId()
            orig_concept_id =   self.REQUEST.get('concept_id', None)
            orig_langcode =     self.REQUEST.get('langcode', None)
        else:
            concept_id =        self.REQUEST.get('concept_id', self.getSessionConceptId())
            langcode =          self.REQUEST.get('langcode', self.getSessionLangcode())
            definition =        self.getSessionDefinition()
            source_id =         self.getSessionSourceId()
            orig_concept_id =   concept_id
            orig_langcode =     langcode

        self.delSessionConceptId()
        self.delSessionLangcode()
        self.delSessionDefinition()
        self.delSessionSourceId()
        return self.get_definition_item_data(concept_id, langcode, orig_concept_id, orig_langcode, definition, source_id)


        return self.get_definition_item_data(self.REQUEST.get('concept_id', None), self.REQUEST.get('langcode', None))


    #statistics
    def getAllDef(self):
        query = [('meta_type',DEFINITION_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getDefNumber(self):
        return len(self.getAllDef())

    def getDefTransNumber(self):
        results = {}
        for def_ob in self.getAllDef():
            try:    tr_count = results[def_ob.langcode][0]
            except: tr_count = 0
            tr_count += 1

            try:    src_count = results[def_ob.langcode][1]
            except: src_count = 0
            if def_ob.source_id: src_count += 1

            results[def_ob.langcode] = (tr_count, src_count)
        return results

    def getDefWithSource(self):
        count = 0
        for def_ob in self.getAllDef():
            if len(def_ob.source_id): count += 1
        return count

    def getEmptyDefs(self):
        empty_count = 0
        for def_ob in self.getAllDef():
            if not def_ob.definition:
                empty_count += 1
        return empty_count


    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html =       PageTemplateFile("%s/zpt/Definitions/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'definitions_html')
    definitions_html =        PageTemplateFile("%s/zpt/Definitions/definitions" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html =   PageTemplateFile("%s/zpt/Definitions/statistics" % NAAYATHESAURUS_PATH, globals())
Exemplo n.º 18
0
class AltTerms(SimpleItem, session_manager):
    """ AltTerms """

    meta_type = ALTTERMS_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/alt_terms.gif'

    manage_options = (
        {'label':'Properties',      'action':'properties_html'},
        {'label':'Management',      'action':'altterms_html'},
        {'label':'Statistics',      'action':'statistics_html'},
        {'label':'Undo',            'action':'manage_UndoForm'},)

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id =           id
        self.title =        title
        self.altterms =    PersistentMapping()


    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')
    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for AltTerms """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')


    #alt_terms management
    def __add_altterm(self, concept_id, langcode, alt_name):
        #create a new item
        item = AltTermItem(concept_id, langcode, alt_name)
        self.altterms[(concept_id, langcode)] = item
        self.catalog.CatalogObject(item)

    def __update_altterm(self, concept_id, old_concept_id, langcode, old_langcode, alt_name):
        #modify an item
        item = self.altterms.get((old_concept_id, old_langcode))
        if item is not None:
            self.__delete_altterm((old_concept_id, old_langcode))
        self.__add_altterm(concept_id, langcode, alt_name)

    def __delete_altterm(self, ids):
        #delete 1 or more items
        if type(ids) != type((1,1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_altterms()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]


    #altterm constraints
    security.declareProtected(view_management_screens, 'checkAltTerm')
    def checkAltTerm(self, concept_id):
        """ """
        if self.getConceptsFolder().get_concept_by_id(concept_id):
            return 1
        return 0

    security.declareProtected(view_management_screens, 'getIdsList')
    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.altterms.keys()
        return th_utils().getIdsList(ids)


    #terms getters
    def get_altterms(self):
        #get all alt_terms
        return self.altterms

    def get_altterms_sorted(self):
        #get all alt_terms sorted
        return th_utils().utSortObjsListByAttr(self.altterms.values(), 'concept_id', 0)

    def get_altterm_by_id(self, id):
        #get an item
        try:    return self.altterms[id]
        except: return None

    def get_altterm_item_data(self,concept_id, langcode, orig_concept_id, orig_langcode, alt_name):
        #get an item data
        item = self.get_altterm_by_id((orig_concept_id, orig_langcode))
        if item is not None:
            if alt_name is None:
                alt_name = item.alt_name
            return ['update', concept_id, langcode, alt_name, orig_concept_id, orig_langcode]
        else:
            return ['add', concept_id, langcode, alt_name, '', '']


    #alt_terms api
    security.declareProtected(view_management_screens, 'manage_add_altterm')
    def manage_add_altterm(self, concept_id='', langcode='', alt_name='', REQUEST=None):
        """ manage alt_terms """
        err = 0
        if self.checkAltTerm(concept_id):
            self.__add_altterm(concept_id, langcode, alt_name)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionLangcode(langcode)
                self.setSessionAltName(alt_name)
                self.setSessionErrorsTrans('${concept_id} is not a valid concept ID.', concept_id=concept_id)
            else:
                self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('altterms_html')

    security.declareProtected(view_management_screens, 'manage_update_altterm')
    def manage_update_altterm(self, concept_id='', old_concept_id='', langcode='', old_langcode='', alt_name='', REQUEST=None):
        """ update alt_term """
        err = 0
        if self.checkAltTerm(concept_id):
            self.__update_altterm(concept_id, old_concept_id, langcode, old_langcode, alt_name)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionLangcode(langcode)
                self.setSessionAltName(alt_name)
                self.setSessionErrorsTrans('${concept_id} is not a valid concept ID.', concept_id=concept_id)
                REQUEST.RESPONSE.redirect('altterms_html?concept_id=%s&langcode=%s' % (old_concept_id, old_langcode))
            else:
                self.setSessionInfoTrans('Record updated.')
                REQUEST.RESPONSE.redirect('altterms_html')

    security.declareProtected(view_management_screens, 'manage_delete_altterms')
    def manage_delete_altterms(self, ids=[], delete_all='', REQUEST=None):
        """ delete alt_terms """
        if delete_all:  ids = self.getIdsList(ids, 1)
        else:           ids = self.getIdsList(ids)
        self.__delete_altterm(ids)

        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.')
            REQUEST.RESPONSE.redirect('altterms_html')

    security.declareProtected(view_management_screens, 'getAltTermItemData')
    def getAltTermItemData(self):
        """ return a term based on its ID """
        if self.isSessionConceptId():
            concept_id =        self.getSessionConceptId()
            langcode =          self.getSessionLangcode()
            alt_name =          self.getSessionAltName()
            orig_concept_id =   self.REQUEST.get('concept_id', None)
            orig_langcode =     self.REQUEST.get('langcode', None)
        else:
            concept_id =        self.REQUEST.get('concept_id', self.getSessionConceptId())
            langcode =          self.REQUEST.get('langcode', self.getSessionLangcode())
            alt_name =          self.getSessionAltName()
            orig_concept_id =   concept_id
            orig_langcode =     langcode

        self.delSessionConceptId()
        self.delSessionLangcode()
        self.delSessionAltName()
        return self.get_altterm_item_data(concept_id, langcode, orig_concept_id, orig_langcode, alt_name)


    #statistics
    def getAllAltTerms(self):
        query = [('meta_type',ALTTERM_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getAltTermsNumber(self):
        return len(self.getAllAltTerms())

    def getAltTermsTransNumber(self):
        results = {}
        for altt_ob in self.getAllAltTerms():
            try:    tr_count = results[altt_ob.langcode]
            except: tr_count = 0
            results[altt_ob.langcode] = tr_count + 1
        return results

    def getEmptyTrans(self):
        empty_count = 0
        for altterm_ob in self.getAllAltTerms():
            if not altterm_ob.alt_name:
                empty_count += 1
        return empty_count


    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html =   PageTemplateFile("%s/zpt/AltTerms/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'altterms_html')
    altterms_html =     PageTemplateFile("%s/zpt/AltTerms/altterms" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html =   PageTemplateFile("%s/zpt/AltTerms/statistics" % NAAYATHESAURUS_PATH, globals())
class ConceptRelations(SimpleItem, session_manager):
    """ ConceptRelations """

    meta_type = CONCEPT_RELATIONS_METATYPE
    product_name = NAAYATHESAURUS_PRODUCT_NAME
    icon = 'misc_/NaayaThesaurus/concept_relations.gif'

    manage_options = (
        {'label':'Properties',      'action':'properties_html'},
        {'label':'Management',      'action':'concept_relations_html'},
        {'label':'Import',   'action':'import_html'},
        {'label':'Statistics',      'action':'statistics_html'},
        {'label':'Undo',            'action':'manage_UndoForm'},)

    security = ClassSecurityInfo()

    def __init__(self, id, title):
        """ constructor """
        self.id =                   id
        self.title =                title
        self.concept_relations =    PersistentMapping()


    #basic properties
    security.declareProtected(view_management_screens, 'manageBasicProperties')
    def manageBasicProperties(self, title='', REQUEST=None):
        """ manage basic properties for ConceptRelations """
        self.title = title
        self._p_changed = 1
        if REQUEST:
            self.setSessionInfoTrans('Saved changes.')
            return REQUEST.RESPONSE.redirect('properties_html')


    #concept relations management
    def __add_relation(self, concept_id, relation_id, relation_type):
        #create a new item
        item = ConceptRelationsItem(concept_id, relation_id, relation_type)
        self.concept_relations[(concept_id, relation_id, relation_type)] = item
        self.catalog.CatalogObject(item)

    def __update_relation(self, concept_id, old_concept_id, relation_id,
                        old_relation_id, relation_type, old_relation_type):
        #modify an item
        l_old_id = (old_concept_id, old_relation_id, old_relation_type)
        item = self.concept_relations.get(l_old_id)
        if item is not None:
            self.__delete_relation(l_old_id)
        self.__add_relation(concept_id, relation_id, relation_type)

    def __delete_relation(self, ids):
        #delete 1 or more items
        if type(ids) != type((1,1)):
            ids = th_utils().utConvertToList(ids)
        else:
            ids = [ids]
        collection = self.get_relations()

        for id in ids:
            self.catalog.UncatalogObject(collection[id])
            del collection[id]


    #concept relations constraints
    security.declareProtected(view_management_screens, 'checkCpRel')
    def checkCpRel(self, concept_id):
        """ """
        if self.getConceptsFolder().get_concept_by_id(concept_id):
            return 1
        return 0

    security.declareProtected(view_management_screens, 'getIdsList')
    def getIdsList(self, ids, all=0):
        """ """
        if all: return self.concept_relations.keys()
        return th_utils().getIdsList(ids)


    #relations getters
    def get_relations(self):
        #get all relations
        return self.concept_relations

    def get_relations_sorted(self):
        #get all relations sorted
        return th_utils().utSortObjsListByAttr(self.concept_relations.values(), 'concept_id', 0)

    def get_relation_by_id(self, id):
        #get an item
        try:    return self.concept_relations[id]
        except: return None

    def get_relations_item_data(self, concept_id, relation_id, relation_type,
                                orig_concept_id, orig_relation_id, orig_relation_type):
        #get an item data
        item = self.get_relation_by_id((orig_concept_id, orig_relation_id, orig_relation_type))
        if item is not None:
            return ['update', concept_id, relation_id, relation_type,
                    orig_concept_id, orig_relation_id, orig_relation_type]
        else:
            return ['add', concept_id, relation_id, relation_type, '', '', '']


    #concept relations api
    security.declareProtected(view_management_screens, 'manage_add_relation')
    def manage_add_relation(self, concept_id='', relation_id='', relation_type='', REQUEST=None):
        """ manage relations """
        err = 0
        if self.checkCpRel(concept_id) and self.checkCpRel(relation_id):
            self.__add_relation(concept_id, relation_id, relation_type)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionRelationId(relation_id)
                self.setSessionRelationType(relation_type)
                self.setSessionErrorsTrans('${concept_id} is not a valid concept ID.', concept_id=concept_id)
            else:
                self.setSessionInfoTrans('Record added.')
            REQUEST.RESPONSE.redirect('concept_relations_html')

    security.declareProtected(view_management_screens, 'manage_update_relation')
    def manage_update_relation(self, concept_id='', old_concept_id='', relation_id='',
                            old_relation_id='', relation_type='', old_relation_type='', REQUEST=None):
        """ update relation """
        err = 0
        if self.checkCpRel(concept_id) and self.checkCpRel(relation_id):
            self.__update_relation(concept_id, old_concept_id, relation_id,
                                   old_relation_id, relation_type, old_relation_type)
        else:
            err = 1

        if REQUEST:
            if err:
                self.setSessionConceptId(concept_id)
                self.setSessionRelationId(relation_id)
                self.setSessionRelationType(relation_type)
                self.setSessionErrorsTrans('${concept_id} is not a valid concept ID.', concept_id=concept_id)
                REQUEST.RESPONSE.redirect('concept_relations_html?concept_id=%s&relation_id=%s&relation_type=%s'
                                           % (old_concept_id, old_relation_id, old_relation_type))
            else:
                self.setSessionInfoTrans('Record updated.')
                REQUEST.RESPONSE.redirect('concept_relations_html')

    security.declareProtected(view_management_screens, 'manage_delete_relations')
    def manage_delete_relations(self, ids=[], delete_all='', REQUEST=None):
        """ delete relations """
        if delete_all:  ids = self.getIdsList(ids, 1)
        else:           ids = self.getIdsList(ids)
        self.__delete_relation(ids)

        if REQUEST:
            self.setSessionInfoTrans('Selected records deleted.')
            REQUEST.RESPONSE.redirect('concept_relations_html')

    security.declareProtected(view_management_screens, 'getRelationItemData')
    def getRelationItemData(self):
        """ return a relation based on its ID """
        if self.isSessionConceptId():
            concept_id =            self.getSessionConceptId()
            relation_id =           self.getSessionRelationId()
            relation_type =         self.getSessionRelationType()
            orig_concept_id =       self.REQUEST.get('concept_id', None)
            orig_relation_id =      self.REQUEST.get('relation_id', None)
            orig_relation_type =    self.REQUEST.get('relation_type', None)
        else:
            concept_id =            self.REQUEST.get('concept_id', self.getSessionConceptId())
            relation_id =           self.REQUEST.get('relation_id', self.getSessionRelationId())
            relation_type =         self.REQUEST.get('relation_type', self.getSessionRelationType())
            orig_concept_id =       concept_id
            orig_relation_id =      relation_id
            orig_relation_type =    relation_type

        self.delSessionConceptId()
        self.delSessionRelationId()
        self.delSessionRelationType()
        return self.get_relations_item_data(concept_id, relation_id, relation_type,
                                            orig_concept_id, orig_relation_id, orig_relation_type)


    #import related
    def skos_import(self, file, REQUEST=None):
        """ """
        parser = relation_parser()

        #parse the SKOS information
        chandler = parser.parseHeader(file)

        if chandler is None:
            if REQUEST:
                self.setSessionErrorsTrans('Parsing error. The file could not be parsed.')
                return REQUEST.RESPONSE.redirect('import_html')

        #info
        count_rel = 0
        err_list = []

        #set data
        for data in chandler.getBody():
            concept_id = data['concept_id'].encode('utf-8').split('/')[-1]
            relation_id = data['relation_id'].encode('utf-8').split('/')[-1]
            relation_type = data['relation_type']

            if concept_id:
                if self.checkCpRel(concept_id) and self.checkCpRel(relation_id):
                    self.__add_relation(concept_id, relation_id, relation_type)
                    count_rel += 1
                else:
                    if not relation_id:
                        err_list.append(('(${content_id}, None) - relation_id not specified', {'concept_id': concept_id }, ))
                    else:
                        err_list.append(('(${concept_id}, ${relation_id}) - at least one of the concept_id or relation_id does not exist',
                        {'concept_id': concept_id, 'relation_id': relation_id }))
            else:
                err_list.append('None - concept_id not specified')

        if REQUEST:
            self.setSessionInfoTrans(['File imported successfully.',
                ('Translations added: ${count_rel}', {'count_rel': count_rel}, )])
            if err_list:
                self.setSessionErrorsTrans(['Relations not imported (by its (concept_id, relation_id)):', err_list, ])
            return REQUEST.RESPONSE.redirect('import_html')


    #relation type related
    def getRelTypes(self):
        """ """
        return RELATION_TYPES

    def getRelTypesIDs(self):
        """ """
        return self.getRelTypes().keys()

    def getRelTypeByID(self, id):
        """ """
        return self.getRelTypes()[id]


    #statistics
    def getAllConRel(self):
        query = [('meta_type',CONCEPT_RELATION_ITEM_METATYPE)]
        return self.catalog.searchCatalog(query)

    def getConRelNumber(self):
        return len(self.getAllConRel())

    def getRelationsNumber(self):
        results = {}
        for conrel_ob in self.getAllConRel():
            try:    br_count = results[1]
            except: br_count = 0
            try:    nr_count = results[2]
            except: nr_count = 0
            try:    re_count = results[3]
            except: re_count = 0

            if conrel_ob.relation_type == '1':
                results[1] = br_count + 1
            elif conrel_ob.relation_type == '2':
                results[2] = nr_count + 1
            elif conrel_ob.relation_type == '3':
                results[3] = re_count + 1

        return results


    #management tabs
    security.declareProtected(view_management_screens, 'properties_html')
    properties_html =           PageTemplateFile("%s/zpt/ConceptRelations/properties" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'concept_relations_html')
    concept_relations_html =    PageTemplateFile("%s/zpt/ConceptRelations/concept_relations" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'statistics_html')
    statistics_html =           PageTemplateFile("%s/zpt/ConceptRelations/statistics" % NAAYATHESAURUS_PATH, globals())

    security.declareProtected(view_management_screens, 'import_html')
    import_html =               PageTemplateFile("%s/zpt/ConceptRelations/import" % NAAYATHESAURUS_PATH, globals())