def link_choose(request, model_name): model = FedoraTypeManager.get_model_class_from_fullname(model_name) data = model.objects.all() page = request.GET.get('page', ) paginator = Paginator(data, 10) try: page = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. page = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. page = paginator.page(paginator.num_pages) context = RequestContext( request, { 'page': page, 'data': data, 'fedora_prefix': None, 'searchstring': request.GET.get('searchstring', ''), }) return render(request, 'fedoralink_ui/link_dialog_content.html', context)
def get_subcollection_model(collection_id, fedora_prefix = None): if fedora_prefix: collection_id = fedora_prefix + '/' + collection_id model = FedoraTemplateCache.get_subcollection_model(FedoraObject.objects.get(pk=collection_id)) if model is None: return None model = FedoraTypeManager.get_model_class_from_fullname(model) return model
def get_subcollection_model(collection_id, fedora_prefix=None): if fedora_prefix: collection_id = fedora_prefix + '/' + collection_id model = FedoraTemplateCache.get_subcollection_model( FedoraObject.objects.get(pk=collection_id)) if model is None: return None model = FedoraTypeManager.get_model_class_from_fullname(model) return model
def __init__(cls, name, bases, attrs): super(IndexableFedoraObjectMetaclass, cls).__init__(name, list(bases), attrs) indexed_fields = tuple( IndexableFedoraObjectMetaclass.all_indexed_fields(cls)) processed_rdf_names = set() for p in indexed_fields: if p.rdf_name in processed_rdf_names: raise AttributeError( "Property with rdf name %s already implemented" % p.rdf_name) processed_rdf_names.add(p.rdf_name) p.instrument(cls, p.name) # store django _meta cls._meta = DjangoMetadataBridge(cls, indexed_fields) for k, v in IndexableFedoraObjectMetaclass.fill_from_meta(cls).items(): if not hasattr(cls._meta, k): # print("Setting on %s: %s -> %s" % (cls, k, v)) setattr(cls._meta, k, v) else: # print("Ignoring on %s: %s" % (cls, k)) pass if not hasattr(cls._meta, 'rdf_types'): setattr(cls._meta, 'rdf_types', ()) application = cls.__module__ + "." + cls.__class__.__name__ application = application.split('.')[:-1] if application and application[-1] == 'models': application = application[:-1] setattr(cls._meta, 'application', '.'.join(application)) if cls._meta.rdf_types and not cls.__name__.endswith('_bound'): FedoraTypeManager.register_model(cls, on_rdf_type=cls._meta.rdf_types) class_prepared.send(sender=cls)
def link_choose(request, model_name): model = FedoraTypeManager.get_model_class_from_fullname(model_name) data = model.objects.all() page = request.GET.get('page', ) paginator = Paginator(data, 10) try: page = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. page = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. page = paginator.page(paginator.num_pages) context = RequestContext(request, { 'page': page, 'data': data, 'fedora_prefix': None, 'searchstring': request.GET.get('searchstring', ''), }) return render(request, 'fedoralink_ui/link_dialog_content.html', context)
def handle(self, *args, **options): FedoraTypeManager.populate() models = list(args) models.sort() fields = {} model_classes = set() for model_name in models: model_name = model_name.split('.') module_name = '.'.join(model_name[:-1]) model_name = model_name[-1] class_for_name(module_name, model_name) modelclz = FedoraTypeManager.get_model_class(model_name) for clz in inspect.getmro(modelclz): if clz == FedoraObject or issubclass(clz, FedoraObject): model_classes.add(clz.__name__) for field in modelclz.indexed_fields: if field.name not in fields: fields[field.name] = field else: fields[field.name] = field.combine(fields[field.name]) print(field) print() ldpath = ['id = . :: xsd:string ;'] all_fields = [] for field in fields.values(): field_indexer_name = indexer_name(field) field_rdf_name = field.rdf_name if field_indexer_name.endswith('_t'): if MULTI_LANG.issubset(field.field_type): from django.conf import settings langstrings = [] for langi, lang in enumerate(settings.LANGUAGES): if langi: langstrings.append(', " ", ') langstrings.append('<{0}>[@{1}]'.format( field_rdf_name, lang[0])) all_fields.append('<{0}>[@{1}]'.format( field_rdf_name, lang[0])) all_fields.append('" "') ldpath.append(""" {0} = fn:concat({1}) :: {2}; """.format(field_indexer_name, ''.join(langstrings), field.xml_schema_type).strip()) else: ldpath.append(""" {0} = <{1}> :: {2}; """.format(field_indexer_name, field_rdf_name, field.xml_schema_type).strip()) all_fields.append('<%s>' % field_rdf_name) all_fields.append('" "') if MULTI_LANG.issubset(field.field_type): # multi lang field, generate all languages from settings.py from django.conf import settings for lang in settings.LANGUAGES: ldpath.append(""" {3}__{0} = <{1}>[@{3}] :: {2}; """.format(field_indexer_name, field_rdf_name, field.xml_schema_type, lang[0]).strip()) ldpath.append(""" sort__{3}__{0}_s = <{1}>[@{3}] :: {2}; """.format(field_indexer_name[:-3], field_rdf_name, field.xml_schema_type, lang[0]).strip()) else: ldpath.append(""" sort__{0}_s = <{1}> :: {2}; """.format(field_indexer_name[:-3], field_rdf_name, field.xml_schema_type).strip()) else: if MULTI_LANG.issubset(field.field_type): from django.conf import settings langstrings = [] for langi, lang in enumerate(settings.LANGUAGES): if langi: langstrings.append(', " ", ') langstrings.append('<{0}>[@{1}]'.format( field_rdf_name, lang[0])) all_fields.append('<{0}>[@{1}]'.format( field_rdf_name, lang[0])) all_fields.append('" "') ldpath.append(""" {0} = fn:concat({1}) :: {2}; """.format(field_indexer_name, ''.join(langstrings), field.xml_schema_type).strip()) else: ldpath.append(""" {0} = <{1}> :: {2}; """.format(field_indexer_name, field_rdf_name, field.xml_schema_type).strip()) if MULTI_LANG.issubset(field.field_type): # multi lang field, generate all languages from settings.py from django.conf import settings for lang in settings.LANGUAGES: ldpath.append(""" {3}__{0} = <{1}>[@{3}] :: {2}; """.format(field_indexer_name, field_rdf_name, field.xml_schema_type, lang[0]).strip()) ldpath.append( 'fedora_parent_id_t = <http://fedora.info/definitions/v4/repository#hasParent> :: xsd:string;' ) ldpath.append('fedora_mixin_types_t = "%s" :: xsd:string;' % ' '.join(model_classes)) if all_fields: ldpath.append('solr_all_fields_t = fn:concat(%s) :: xsd:string;' % ', '.join(all_fields)) ldpath = '\n'.join(ldpath) print(ldpath) name = '__'.join( [inflection.underscore(x.split('.')[-1]) for x in models]) mgr = FedoraManager.get_manager() mgr.connection.direct_put( 'fedora:system/fedora:transform/fedora:ldpath/' + name + "/fedora:Container", data=ldpath, content_type='application/rdf+ldpath') # prepare schema inside solr - not needed, using wildcards # solr = FedoraManager.get_indexer() # for field in fields.values(): # solr.install_indexed_field(field) log.info("Transformation created with name `%s'", name)
def handle(self, *args, **options): FedoraTypeManager.populate() models = list(args) for model_name in models: fields = {} split_model_name = model_name.split('.') indexer_model_name = '_'.join(split_model_name) module_name = '.'.join(split_model_name[:-1]) split_model_name = split_model_name[-1] class_for_name(module_name, split_model_name) modelclz = FedoraTypeManager.get_model_class(split_model_name) for field in modelclz._meta.fields: fldname = url2id(field.rdf_name) if fldname not in fields: fields[fldname] = field indexer = connections['repository'].indexer existing_mapping = indexer.get_mapping(indexer_model_name) existing_properties = existing_mapping.get('properties', {}) new_mapping = { } new_properties = { } fields['_fedora_id'] = FEDORA_ID_FIELD fields['_fedora_parent'] = FEDORA_PARENT_FIELD fields['_fedora_type'] = FEDORA_TYPE_FIELD fields['_fedoralink_model'] = FEDORALINK_TYPE_FIELD fields['_fedora_created'] = FEDORA_CREATED_FIELD fields['_fedora_last_modified'] = FEDORA_LAST_MODIFIED_FIELD for fldname, field in fields.items(): if fldname in existing_properties: continue props = {} new_properties[fldname] = props if isinstance(field, IndexedLanguageField): props['type'] = 'nested' props["include_in_root"] = 'true' props['properties'] = self.gen_languages_mapping(fldname + ".") elif isinstance(field, IndexedTextField): props['type'] = 'string' props['index'] = 'not_analyzed' props['copy_to'] = fldname + "__fulltext" new_properties[fldname + "__fulltext"] = { 'type': 'string', } elif isinstance(field, IndexedDateTimeField): props['type'] = 'date' props['index'] = 'not_analyzed' elif isinstance(field, IndexedDateField): props['type'] = 'date' props['index'] = 'not_analyzed' elif isinstance(field, IndexedIntegerField): props['type'] = 'long' props['index'] = 'not_analyzed' elif isinstance(field, IndexedGPSField): props['type'] = 'string' props['index'] = 'not_analyzed' elif isinstance(field, IndexedLinkedField) or isinstance(field, IndexedBinaryField) : props['type'] = 'string' props['index'] = 'not_analyzed' else: raise Exception("Mapping type %s not handled yet" % type(field)) new_mapping['_all'] = { "store": True } new_mapping['properties'] = new_properties print(json.dumps(new_mapping, indent=4)) indexer.save_mapping(indexer_model_name, new_mapping)
def __init__(cls, name, bases, attrs): super(IndexableFedoraObjectMetaclass, cls).__init__(name, list(bases), attrs) def create_property(prop): def _convert_to_rdf(data): if data is None: return [] return prop.convert_to_rdf(data) def getter(self): ret = self.metadata[prop.rdf_name] if isinstance(prop, IndexedLanguageField): return prop.convert_from_rdf(ret) if not prop.multi_valued: # simple type -> return the first item only if len(ret): return prop.convert_from_rdf(ret[0]) else: return None return StringLikeList([prop.convert_from_rdf(x) for x in self.metadata[prop.rdf_name]]) def setter(self, value): collected_streams = __get_streams(value) if len(collected_streams) > 0: if not hasattr(self, '__streams'): setattr(self, '__streams', {}) streams = getattr(self, '__streams') streams[prop] = collected_streams else: if isinstance(value, list) or isinstance(value, tuple): value = [_convert_to_rdf(x) for x in value] else: value = _convert_to_rdf(value) self.metadata[prop.rdf_name] = value def __get_streams(value): streams = [] if isinstance(value, tuple) or isinstance(value, list): for x in value: rr = __get_streams(x) streams.extend(rr) elif isinstance(value, UploadedFile) or isinstance(value, TypedStream): streams.append(value) return streams return property(getter, setter) indexed_fields = tuple(IndexableFedoraObjectMetaclass.all_indexed_fields(cls)) processed_rdf_names = set() for p in indexed_fields: if p.rdf_name in processed_rdf_names: raise AttributeError("Property with rdf name %s already implemented" % p.rdf_name) processed_rdf_names.add(p.rdf_name) setattr(cls, p.name, create_property(p)) # store django _meta cls._meta = DjangoMetadataBridge(cls, indexed_fields) for k, v in IndexableFedoraObjectMetaclass.fill_from_meta(cls).items(): if not hasattr(cls._meta, k): # print("Setting on %s: %s -> %s" % (cls, k, v)) setattr(cls._meta, k, v) else: # print("Ignoring on %s: %s" % (cls, k)) pass if not hasattr(cls._meta, 'rdf_types'): setattr(cls._meta, 'rdf_types', ()) if cls._meta.rdf_types and not cls.__name__.endswith('_bound'): FedoraTypeManager.register_model(cls, on_rdf_type=cls._meta.rdf_types) class_prepared.send(sender=cls)
def get_subcollection_model_from_object(collection_object): model = FedoraTemplateCache.get_subcollection_model(collection_object) if model is None: return None model = FedoraTypeManager.get_model_class_from_fullname(model) return model
def handle(self, *args, **options): FedoraTypeManager.populate() models = list(args) models.sort() fields = {} model_classes = set() for model_name in models: model_name = model_name.split('.') module_name = '.'.join(model_name[:-1]) model_name = model_name[-1] class_for_name(module_name, model_name) modelclz = FedoraTypeManager.get_model_class(model_name) for clz in inspect.getmro(modelclz): if clz == FedoraObject or issubclass(clz, FedoraObject): model_classes.add(clz.__name__) for field in modelclz.indexed_fields: if field.name not in fields: fields[field.name] = field else: fields[field.name] = field.combine(fields[field.name]) print(field) print() ldpath = [ 'id = . :: xsd:string ;' ] all_fields = [] for field in fields.values(): field_indexer_name = indexer_name(field) field_rdf_name = field.rdf_name if field_indexer_name.endswith('_t'): if MULTI_LANG.issubset(field.field_type): from django.conf import settings langstrings = [] for langi, lang in enumerate(settings.LANGUAGES): if langi: langstrings.append(', " ", ') langstrings.append('<{0}>[@{1}]'.format(field_rdf_name, lang[0])) all_fields.append('<{0}>[@{1}]'.format(field_rdf_name, lang[0])) all_fields.append('" "') ldpath.append( """ {0} = fn:concat({1}) :: {2}; """.format(field_indexer_name, ''.join(langstrings), field.xml_schema_type).strip() ) else: ldpath.append( """ {0} = <{1}> :: {2}; """.format(field_indexer_name, field_rdf_name, field.xml_schema_type).strip() ) all_fields.append('<%s>' % field_rdf_name) all_fields.append('" "') if MULTI_LANG.issubset(field.field_type): # multi lang field, generate all languages from settings.py from django.conf import settings for lang in settings.LANGUAGES: ldpath.append( """ {3}__{0} = <{1}>[@{3}] :: {2}; """.format(field_indexer_name, field_rdf_name, field.xml_schema_type, lang[0]).strip() ) ldpath.append( """ sort__{3}__{0}_s = <{1}>[@{3}] :: {2}; """.format(field_indexer_name[:-3], field_rdf_name, field.xml_schema_type, lang[0]).strip() ) else: ldpath.append( """ sort__{0}_s = <{1}> :: {2}; """.format(field_indexer_name[:-3], field_rdf_name, field.xml_schema_type).strip() ) else: if MULTI_LANG.issubset(field.field_type): from django.conf import settings langstrings = [] for langi, lang in enumerate(settings.LANGUAGES): if langi: langstrings.append(', " ", ') langstrings.append('<{0}>[@{1}]'.format(field_rdf_name, lang[0])) all_fields.append('<{0}>[@{1}]'.format(field_rdf_name, lang[0])) all_fields.append('" "') ldpath.append( """ {0} = fn:concat({1}) :: {2}; """.format(field_indexer_name, ''.join(langstrings), field.xml_schema_type).strip() ) else: ldpath.append( """ {0} = <{1}> :: {2}; """.format(field_indexer_name, field_rdf_name, field.xml_schema_type).strip() ) if MULTI_LANG.issubset(field.field_type): # multi lang field, generate all languages from settings.py from django.conf import settings for lang in settings.LANGUAGES: ldpath.append( """ {3}__{0} = <{1}>[@{3}] :: {2}; """.format(field_indexer_name, field_rdf_name, field.xml_schema_type, lang[0]).strip() ) ldpath.append('fedora_parent_id_t = <http://fedora.info/definitions/v4/repository#hasParent> :: xsd:string;') ldpath.append('fedora_mixin_types_t = "%s" :: xsd:string;' % ' '.join(model_classes)) if all_fields: ldpath.append('solr_all_fields_t = fn:concat(%s) :: xsd:string;' % ', '.join(all_fields)) ldpath = '\n'.join(ldpath) print(ldpath) name = '__'.join([inflection.underscore(x.split('.')[-1]) for x in models]) mgr = FedoraManager.get_manager() mgr.connection.direct_put('fedora:system/fedora:transform/fedora:ldpath/' + name + "/fedora:Container", data=ldpath, content_type='application/rdf+ldpath') # prepare schema inside solr - not needed, using wildcards # solr = FedoraManager.get_indexer() # for field in fields.values(): # solr.install_indexed_field(field) log.info("Transformation created with name `%s'", name)
def handle(self, *args, **options): FedoraTypeManager.populate() models = options['model_name'] for model_name in models: fields = {} split_model_name = model_name.split('.') indexer_model_name = '_'.join(split_model_name) module_name = '.'.join(split_model_name[:-1]) split_model_name = split_model_name[-1] class_for_name(module_name, split_model_name) modelclz = FedoraTypeManager.get_model_class(split_model_name) for field in modelclz._meta.fields: fldname = url2id(field.rdf_name) if fldname not in fields: fields[fldname] = field indexer = connections['repository'].indexer existing_mapping = indexer.get_mapping(indexer_model_name) existing_properties = existing_mapping.get('properties', {}) new_mapping = {} new_properties = {} fields['_fedora_id'] = FEDORA_ID_FIELD fields['_fedora_parent'] = FEDORA_PARENT_FIELD fields['_fedora_type'] = FEDORA_TYPE_FIELD fields['_fedoralink_model'] = FEDORALINK_TYPE_FIELD fields['_fedora_created'] = FEDORA_CREATED_FIELD fields['_fedora_last_modified'] = FEDORA_LAST_MODIFIED_FIELD fields['_collection_child_types'] = CESNET_RDF_TYPES print('ADD fields to mapping') for fldname, field in fields.items(): if fldname in existing_properties: continue props = {} new_properties[fldname] = props if isinstance(field, IndexedLanguageField): props['type'] = 'nested' props["include_in_root"] = 'true' props['properties'] = self.gen_languages_mapping(fldname + ".") elif isinstance(field, IndexedTextField): props['type'] = 'keyword' props['copy_to'] = fldname + "__fulltext" new_properties[fldname + "__fulltext"] = { 'type': 'text', } elif isinstance(field, IndexedDateTimeField): props['type'] = 'date' elif isinstance(field, IndexedDateField): props['type'] = 'date' elif isinstance(field, IndexedIntegerField): props['type'] = 'long' elif isinstance(field, IndexedGPSField): props['type'] = 'keyword' elif isinstance(field, IndexedLinkedField) or isinstance( field, IndexedBinaryField): props['type'] = 'keyword' else: raise Exception("Mapping type %s not handled yet" % type(field)) new_mapping['_all'] = {"store": True} new_mapping['properties'] = new_properties print(json.dumps(new_mapping, indent=4)) indexer.save_mapping(indexer_model_name, new_mapping)