コード例 #1
0
class MappingVersionIndex(OCLSearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    external_id = SortOrFilterField(model_attr='external_id',
                                    indexed=True,
                                    stored=True,
                                    null=True)
    lastUpdate = indexes.DateTimeField(model_attr='updated_at',
                                       indexed=True,
                                       stored=True)
    retired = indexes.BooleanField(model_attr='retired',
                                   indexed=True,
                                   stored=True,
                                   faceted=True)
    mapType = SortOrFilterField(model_attr='map_type',
                                indexed=True,
                                stored=True,
                                faceted=True)
    source = SortOrFilterField(model_attr='source',
                               indexed=True,
                               stored=True,
                               faceted=True)
    owner = SortOrFilterField(model_attr='owner',
                              indexed=True,
                              stored=True,
                              faceted=True)
    ownerType = SortOrFilterField(model_attr='owner_type',
                                  indexed=True,
                                  stored=True,
                                  faceted=True)
    concept = FilterField(indexed=True, stored=True, faceted=True)
    fromConcept = FilterField(indexed=True, stored=True, faceted=True)
    toConcept = FilterField(indexed=True, stored=True, null=True, faceted=True)
    conceptSource = FilterField(indexed=True, stored=True, faceted=True)
    fromConceptSource = SortOrFilterField(indexed=True,
                                          stored=True,
                                          faceted=True)
    toConceptSource = SortOrFilterField(indexed=True,
                                        stored=True,
                                        faceted=True)
    conceptOwner = FilterField(faceted=True)
    fromConceptOwner = SortOrFilterField(indexed=True,
                                         stored=True,
                                         faceted=True)
    toConceptOwner = SortOrFilterField(indexed=True, stored=True, faceted=True)
    conceptOwnerType = FilterField(faceted=True)
    fromConceptOwnerType = SortOrFilterField(indexed=True,
                                             stored=True,
                                             faceted=True)
    toConceptOwnerType = SortOrFilterField(indexed=True,
                                           stored=True,
                                           faceted=True)
    source_version = FilterField()
    collection = FilterField()
    collection_version = FilterField()
    public_can_view = indexes.BooleanField(model_attr='public_can_view',
                                           indexed=True,
                                           stored=True)
    is_active = indexes.BooleanField(model_attr='is_active',
                                     indexed=True,
                                     stored=True)
    is_latest_version = indexes.BooleanField(model_attr='is_latest_version',
                                             indexed=True,
                                             stored=True)

    def get_model(self):
        return MappingVersion

    def prepare(self, obj):
        self.prepared_data = super(MappingVersionIndex, self).prepare(obj)
        self.prepared_data['fromConcept'] = [
            obj.from_concept_url, obj.from_concept_code, obj.from_concept_name
        ]
        self.prepared_data['toConcept'] = [
            obj.get_to_concept_code(),
            obj.get_to_concept_name()
        ]
        self.prepared_data['concept'] = self.prepared_data[
            'fromConcept'] + self.prepared_data['toConcept']
        self.prepared_data['fromConceptSource'] = obj.from_source_name
        self.prepared_data['toConceptSource'] = obj.to_source_name
        self.prepared_data['conceptSource'] = [
            obj.from_source_name, obj.to_source_name
        ]
        self.prepared_data['fromConceptOwner'] = obj.from_source_owner
        self.prepared_data['toConceptOwner'] = obj.to_source_owner
        self.prepared_data['conceptOwner'] = [
            obj.from_source_owner, obj.to_source_owner
        ]
        self.prepared_data['fromConceptOwnerType'] = obj.from_source_owner_type
        self.prepared_data['toConceptOwnerType'] = obj.to_source_owner_type
        self.prepared_data['conceptOwnerType'] = [
            obj.from_source_owner_type, obj.to_source_owner_type
        ]

        source_version_ids = []
        source = obj.parent
        source_versions = SourceVersion.objects.filter(
            versioned_object_id=source.id, )
        for sv in source_versions:
            if obj.id in sv.mappings:
                source_version_ids.append(sv.id)
        self.prepared_data['source_version'] = source_version_ids

        return self.prepared_data

    def prepare_collection_version(self, obj):
        return obj.collection_version_ids

    def prepare_collection(self, obj):
        return obj.collection_ids
コード例 #2
0
class MediaItemIndex(indexes.SearchIndex, indexes.Indexable):

    text = indexes.CharField(document=True, use_template=True)
    item_acces = indexes.CharField(model_attr='collection__public_access',
                                   faceted=True)
    item_status = indexes.CharField(model_attr='collection__document_status',
                                    faceted=True)
    digitized = indexes.BooleanField(default=False, faceted=True)
    media_type = indexes.CharField(model_attr='media_type',
                                   null='None',
                                   faceted=True)
    recording_context = indexes.CharField(
        model_attr='collection__recording_context', default='', faceted=True)
    physical_format = indexes.CharField(
        model_attr='collection__physical_format', default='', faceted=True)
    #content_auto = indexes.EdgeNgramField(model_attr='content')

    #advance search
    title = indexes.CharField(model_attr='title')
    code = KeywordField(model_attr='code', default='')
    location_principal = indexes.CharField(null='None', boost=1.05)
    location_relation = indexes.CharField()
    ethnic_group = indexes.CharField(model_attr='ethnic_group', default='')
    instruments = indexes.CharField(default='')
    collectors = indexes.CharField(model_attr='collector', default='')
    recorded_from_date = indexes.DateField(model_attr='recorded_from_date',
                                           null='None')
    recorded_to_date = indexes.DateField(model_attr='recorded_to_date',
                                         null='None')
    year_published = indexes.IntegerField(
        model_attr='collection__year_published', default='')

    def prepare_digitized(self, obj):
        if obj.file.name:
            return True
        elif '/' in obj.url:
            return True
        else:
            return False

    def get_model(self):
        return MediaItem

    def prepare_location_principal(self, obj):
        if obj.location is not None:
            return u"".join(obj.location.name)
        else:
            return None

    def prepare_location_relation(self, obj):
        location = []
        if obj.location is not None:
            location_alias = LocationAlias.objects.filter(
                location__name=obj.location)
            location_rela = LocationRelation.objects.filter(
                location__name=obj.location)
            for rela in location_rela:
                location.append(rela.ancestor_location.name)
            for alias in location_alias:
                location.append(alias.alias)
            if obj.location.current_location is not None:
                location.append(obj.location.current_location.name)
            #print u"".join(' ' + local for local in location).encode("utf-8")
            #print u"%s".encode("utf-8") % location
            #print [local for local in location]
        return u"".join('|' + local for local in location)

    def prepare_instruments(self, obj):
        item = MediaItemPerformance.objects.all().filter(media_item__exact=obj)
        instruments = []
        for material in item:
            if material.instrument is not None:
                instruments.append(material.instrument.name)
            if material.alias is not None:
                instruments.append(material.alias.name)
        return u"".join('|' + instru for instru in instruments)

    def prepare_collectors(self, obj):
        collectors = []
        collectors.append(obj.collection.collector)
        collectors.append(obj.collector)
        return u"".join('; ' + collector for collector in collectors)
コード例 #3
0
class CourseRunIndex(BaseCourseIndex, indexes.Indexable):
    model = CourseRun

    course_key = indexes.CharField(model_attr='course__key', stored=True)
    org = indexes.CharField()
    number = indexes.CharField()
    status = indexes.CharField(model_attr='status', faceted=True)
    start = indexes.DateTimeField(model_attr='start', null=True, faceted=True)
    end = indexes.DateTimeField(model_attr='end', null=True)
    enrollment_start = indexes.DateTimeField(model_attr='enrollment_start', null=True)
    enrollment_end = indexes.DateTimeField(model_attr='enrollment_end', null=True)
    announcement = indexes.DateTimeField(model_attr='announcement', null=True)
    min_effort = indexes.IntegerField(model_attr='min_effort', null=True)
    max_effort = indexes.IntegerField(model_attr='max_effort', null=True)
    weeks_to_complete = indexes.IntegerField(model_attr='weeks_to_complete', null=True)
    language = indexes.CharField(null=True, faceted=True)
    transcript_languages = indexes.MultiValueField(faceted=True)
    pacing_type = indexes.CharField(model_attr='pacing_type', null=True, faceted=True)
    marketing_url = indexes.CharField(null=True)
    slug = indexes.CharField(model_attr='slug', null=True)
    seat_types = indexes.MultiValueField(model_attr='seat_types', null=True, faceted=True)
    type = indexes.CharField(model_attr='type', null=True, faceted=True)
    image_url = indexes.CharField(model_attr='image_url', null=True)
    partner = indexes.CharField(null=True, faceted=True)
    program_types = indexes.MultiValueField()
    published = indexes.BooleanField(null=False, faceted=True)
    hidden = indexes.BooleanField(model_attr='hidden', faceted=True)
    mobile_available = indexes.BooleanField(model_attr='mobile_available', faceted=True)
    authoring_organization_uuids = indexes.MultiValueField()
    staff_uuids = indexes.MultiValueField()
    subject_uuids = indexes.MultiValueField()
    has_enrollable_paid_seats = indexes.BooleanField(null=False)
    first_enrollable_paid_seat_sku = indexes.CharField(null=True)
    paid_seat_enrollment_end = indexes.DateTimeField(null=True)
    license = indexes.MultiValueField(model_attr='license', faceted=True)
    has_enrollable_seats = indexes.BooleanField(model_attr='has_enrollable_seats', null=False)
    is_current_and_still_upgradeable = indexes.BooleanField(null=False)

    def prepare_aggregation_key(self, obj):
        # Aggregate CourseRuns by Course key since that is how we plan to dedup CourseRuns on the marketing site.
        return 'courserun:{}'.format(obj.course.key)

    def prepare_has_enrollable_paid_seats(self, obj):
        return obj.has_enrollable_paid_seats()

    def prepare_first_enrollable_paid_seat_sku(self, obj):
        return obj.first_enrollable_paid_seat_sku()

    def prepare_is_current_and_still_upgradeable(self, obj):
        return obj.is_current_and_still_upgradeable()

    def prepare_paid_seat_enrollment_end(self, obj):
        return obj.get_paid_seat_enrollment_end()

    def prepare_partner(self, obj):
        return obj.course.partner.short_code

    def prepare_published(self, obj):
        return obj.status == CourseRunStatus.Published

    def prepare_language(self, obj):
        return self._prepare_language(obj.language)

    def prepare_number(self, obj):
        course_run_key = CourseKey.from_string(obj.key)
        return course_run_key.course

    def prepare_org(self, obj):
        course_run_key = CourseKey.from_string(obj.key)
        return course_run_key.org

    def prepare_transcript_languages(self, obj):
        return [self._prepare_language(language) for language in obj.transcript_languages.all()]

    def prepare_marketing_url(self, obj):
        return obj.marketing_url

    def prepare_program_types(self, obj):
        return obj.program_types

    def prepare_staff_uuids(self, obj):
        return [str(staff.uuid) for staff in obj.staff.all()]

    def prepare_subject_uuids(self, obj):
        return [str(subject.uuid) for subject in obj.subjects.all()]
コード例 #4
0
class ProgramIndex(BaseIndex, indexes.Indexable, OrganizationsMixin):
    model = Program

    uuid = indexes.CharField(model_attr='uuid')
    title = indexes.CharField(model_attr='title', boost=TITLE_FIELD_BOOST)
    title_autocomplete = indexes.NgramField(model_attr='title',
                                            boost=TITLE_FIELD_BOOST)
    subtitle = indexes.CharField(model_attr='subtitle')
    type = indexes.CharField(model_attr='type__name', faceted=True)
    marketing_url = indexes.CharField(null=True)
    search_card_display = indexes.MultiValueField()
    organizations = indexes.MultiValueField(faceted=True)
    authoring_organizations = indexes.MultiValueField(faceted=True)
    authoring_organizations_autocomplete = indexes.NgramField(
        boost=ORG_FIELD_BOOST)
    authoring_organization_uuids = indexes.MultiValueField()
    subject_uuids = indexes.MultiValueField()
    staff_uuids = indexes.MultiValueField()
    authoring_organization_bodies = indexes.MultiValueField()
    credit_backing_organizations = indexes.MultiValueField(faceted=True)
    card_image_url = indexes.CharField(model_attr='card_image_url', null=True)
    status = indexes.CharField(model_attr='status', faceted=True)
    partner = indexes.CharField(model_attr='partner__short_code',
                                null=True,
                                faceted=True)
    start = indexes.DateTimeField(model_attr='start', null=True, faceted=True)
    seat_types = indexes.MultiValueField(model_attr='seat_types__slug',
                                         null=True,
                                         faceted=True)
    published = indexes.BooleanField(null=False, faceted=True)
    min_hours_effort_per_week = indexes.IntegerField(
        model_attr='min_hours_effort_per_week', null=True)
    max_hours_effort_per_week = indexes.IntegerField(
        model_attr='max_hours_effort_per_week', null=True)
    weeks_to_complete_min = indexes.IntegerField(
        model_attr='weeks_to_complete_min', null=True)
    weeks_to_complete_max = indexes.IntegerField(
        model_attr='weeks_to_complete_max', null=True)
    language = indexes.MultiValueField(faceted=True)
    hidden = indexes.BooleanField(model_attr='hidden', faceted=True)
    is_program_eligible_for_one_click_purchase = indexes.BooleanField(
        model_attr='is_program_eligible_for_one_click_purchase', null=False)

    def prepare_aggregation_key(self, obj):
        return 'program:{}'.format(obj.uuid)

    def prepare_published(self, obj):
        return obj.status == ProgramStatus.Active

    def prepare_organizations(self, obj):
        return self.prepare_authoring_organizations(
            obj) + self.prepare_credit_backing_organizations(obj)

    def prepare_subject_uuids(self, obj):
        return [str(subject.uuid) for subject in obj.subjects]

    def prepare_staff_uuids(self, obj):
        return {
            str(staff.uuid)
            for course_run in obj.course_runs
            for staff in course_run.staff.all()
        }

    def prepare_credit_backing_organizations(self, obj):
        return self._prepare_organizations(
            obj.credit_backing_organizations.all())

    def prepare_marketing_url(self, obj):
        return obj.marketing_url

    def prepare_language(self, obj):
        return [self._prepare_language(language) for language in obj.languages]

    def prepare_search_card_display(self, obj):
        try:
            degree = Degree.objects.get(uuid=obj.uuid)
        except Degree.DoesNotExist:

            return []
        return [
            degree.search_card_ranking, degree.search_card_cost,
            degree.search_card_courses
        ]
コード例 #5
0
    class _PageIndex(_get_index_base()):
        _language = language_code
        language = indexes.CharField()

        text = indexes.CharField(document=True, use_template=False)
        pub_date = indexes.DateTimeField(model_attr='publication_date',
                                         null=True)
        login_required = indexes.BooleanField(model_attr='login_required')
        url = indexes.CharField(stored=True,
                                indexed=False,
                                model_attr='get_absolute_url')
        title = indexes.CharField(stored=True,
                                  indexed=False,
                                  model_attr='get_title')
        site_id = indexes.IntegerField(stored=True,
                                       indexed=True,
                                       model_attr='site_id')

        def prepare(self, obj):
            current_languge = get_language()
            try:
                if current_languge != self._language:
                    activate(self._language)
                request = rf.get("/")
                request.session = {}
                request.LANGUAGE_CODE = self._language
                self.prepared_data = super(_PageIndex, self).prepare(obj)
                plugins = CMSPlugin.objects.filter(
                    language=language_code,
                    placeholder__in=obj.placeholders.all())
                text = u''
                for base_plugin in plugins:
                    instance, plugin_type = base_plugin.get_plugin_instance()
                    if instance is None:
                        # this is an empty plugin
                        continue
                    if hasattr(instance, 'search_fields'):
                        text += u' '.join(
                            force_unicode(
                                _strip_tags(getattr(instance, field, '')))
                            for field in instance.search_fields)
                    if getattr(instance, 'search_fulltext', False) or getattr(
                            plugin_type, 'search_fulltext', False):
                        text += _strip_tags(
                            instance.render_plugin(
                                context=RequestContext(request))) + u' '
                text += obj.get_meta_description() or u''
                text += u' '
                text += obj.get_meta_keywords() or u''
                self.prepared_data['text'] = text
                self.prepared_data['language'] = self._language
                return self.prepared_data
            finally:
                if get_language() != current_languge:
                    activate(current_languge)

        def index_queryset(self):
            # get the correct language and exclude pages that have a redirect
            base_qs = super(_PageIndex, self).index_queryset()
            result_qs = EmptyQuerySet()
            for site_obj in Site.objects.all():
                qs = base_qs.published(site=site_obj.id).filter(
                    Q(title_set__language=language_code)
                    & (Q(title_set__redirect__exact='')
                       | Q(title_set__redirect__isnull=True)))
                if 'publisher' in settings.INSTALLED_APPS:
                    qs = qs.filter(publisher_is_draft=True)
                qs = qs.distinct()
                result_qs |= qs
            return result_qs
コード例 #6
0
ファイル: indexes.py プロジェクト: vladkorkach/tendenci
class TendenciBaseSearchIndex(indexes.SearchIndex):
    text = indexes.CharField(document=True, use_template=True)

    # TendenciBaseModel Fields
    allow_anonymous_view = indexes.BooleanField(
        model_attr='allow_anonymous_view', null=True)
    allow_user_view = indexes.BooleanField(model_attr='allow_user_view',
                                           null=True)
    allow_member_view = indexes.BooleanField(model_attr='allow_member_view',
                                             null=True)
    # allow_anonymous_edit = indexes.BooleanField(model_attr='allow_anonymous_edit')
    allow_user_edit = indexes.BooleanField(model_attr='allow_user_edit',
                                           null=True)
    allow_member_edit = indexes.BooleanField(model_attr='allow_member_edit',
                                             null=True)
    creator = indexes.CharField(model_attr='creator', null=True)
    creator_username = indexes.CharField(model_attr='creator_username',
                                         null=True)
    owner = indexes.CharField(model_attr='owner', null=True)
    owner_username = indexes.CharField(model_attr='owner_username', null=True)
    status = indexes.BooleanField(model_attr='status', null=True)
    status_detail = indexes.CharField(model_attr='status_detail')
    create_dt = indexes.DateTimeField(model_attr='create_dt', null=True)
    update_dt = indexes.DateTimeField(model_attr='update_dt', null=True)

    # permission fields
    users_can_view = indexes.MultiValueField(null=True)
    groups_can_view = indexes.MultiValueField(null=True)

    # PK: needed for exclude list_tags
    primary_key = indexes.CharField(model_attr='pk')

    # add order field for sorting. the subclasses can override
    # the prepare_order method to sort by a different field
    order = indexes.DateTimeField()

    def get_model(self):
        return None

    def prepare_allow_anonymous_view(self, obj):
        if is_whoosh():
            try:
                temp = int(obj.allow_anonymous_view)
            except TypeError:
                temp = 0
            return temp
        return obj.allow_anonymous_view

    def prepare_allow_user_view(self, obj):
        if is_whoosh():
            try:
                temp = int(obj.allow_user_view)
            except TypeError:
                temp = 0
            return temp
        return obj.allow_user_view

    def prepare_allow_member_view(self, obj):
        if is_whoosh():
            try:
                temp = int(obj.allow_member_view)
            except TypeError:
                temp = 0
            return temp
        return obj.allow_member_view

    def prepare_allow_user_edit(self, obj):
        if is_whoosh():
            try:
                temp = int(obj.allow_user_edit)
            except TypeError:
                temp = 0
            return temp
        return obj.allow_user_edit

    def prepare_allow_member_edit(self, obj):
        if is_whoosh():
            try:
                temp = int(obj.allow_member_edit)
            except TypeError:
                temp = 0
            return temp
        return obj.allow_member_edit

    def prepare_status(self, obj):
        if is_whoosh():
            try:
                temp = int(obj.status)
            except TypeError:
                temp = 0
            return temp
        return obj.status

    def prepare_order(self, obj):
        return obj.create_dt

    def get_updated_field(self):
        return 'update_dt'

    def prepare_users_can_view(self, obj):
        """
        This needs to be overwritten if 'view' permission label does not follow the standard convention:
        (app_label).view_(module_name)
        """
        return ObjectPermission.objects.users_with_perms(
            '%s.view_%s' % (obj._meta.app_label, obj._meta.model_name), obj)

    def prepare_groups_can_view(self, obj):
        """
        This needs to be overwritten if 'view' permission label does not follow the standard convention:
        (app_label).view_(module_name)
        """
        return ObjectPermission.objects.groups_with_perms(
            '%s.view_%s' % (obj._meta.app_label, obj._meta.model_name), obj)
コード例 #7
0
ファイル: search_indexes.py プロジェクト: opendream/asip
class OrganizationIndex(indexes.ModelSearchIndex, indexes.Indexable):

    content_type = indexes.CharField(default='Organization')

    type_of_needs = indexes.MultiValueField(indexed=True, stored=True)
    type_of_supports = indexes.MultiValueField(indexed=True, stored=True)
    topics = indexes.MultiValueField(indexed=True, stored=True)
    organization_roles = indexes.MultiValueField(indexed=True, stored=True)
    country = indexes.CharField(indexed=True, stored=True)
    organization_primary_role = indexes.CharField(indexed=True, stored=True)

    organization_types = indexes.MultiValueField(indexed=True, stored=True)
    investor_types = indexes.MultiValueField(indexed=True, stored=True)
    product_launch = indexes.CharField(indexed=True, stored=True)
    funding = indexes.CharField(indexed=True, stored=True)
    request_funding = indexes.CharField(indexed=True, stored=True)

    growth_stage = indexes.MultiValueField(indexed=True, stored=True)

    has_jobs = indexes.BooleanField(indexed=True, stored=True)
    jobs_role = indexes.MultiValueField(indexed=True, stored=True)
    jobs_position = indexes.MultiValueField(indexed=True, stored=True)
    jobs_salary_min = indexes.MultiValueField(indexed=True, stored=True)
    jobs_salary_max = indexes.MultiValueField(indexed=True, stored=True)
    jobs_skill_set = indexes.MultiValueField(indexed=True, stored=True)

    has_relation = indexes.BooleanField(indexed=True, stored=True, default=True)
    is_published = indexes.BooleanField(indexed=True, stored=True)

    popular = indexes.DecimalField(indexed=True, stored=True)



    class Meta:
        model = Organization


    def index_queryset(self, using=None):
        "Used when the entire index for model is updated."
        return self.get_model().objects.filter()

    def prepare_is_published(self, object):
        # is_published = indexes.BooleanField(indexed=True, stored=True)
        return bool(object.status > 0) and not object.is_deleted

    def prepare_type_of_needs(self, object):
        return [inst.permalink for inst in object.type_of_needs.all()]

    def prepare_type_of_supports(self, object):
        return [inst.permalink for inst in object.type_of_supports.all()]

    def prepare_topics(self, object):
        return [inst.permalink for inst in object.topics.all()]

    def prepare_organization_roles(self, object):
        return [inst.permalink for inst in object.organization_roles.all()]

    def prepare_country(self, object):

        if object.country:
            return object.country.permalink
        else:
            return ''

    def prepare_organization_primary_role(self, object):

        if object.organization_primary_role:
            return object.organization_primary_role.permalink
        else:
            return ''

    def prepare_organization_types(self, object):
        return [inst.permalink for inst in object.organization_types.all()]

    def prepare_investor_types(self, object):
        return [inst.permalink for inst in object.investor_types.all()]

    def prepare_product_launch(self, object):
        if object.product_launch:
            return object.product_launch.permalink
        else:
            return ''

    def prepare_funding(self, object):
        if object.funding:
            return object.funding.permalink
        else:
            return ''

    def prepare_request_funding(self, object):
        if object.request_funding:
            return object.request_funding.permalink
        else:
            return ''

    def prepare_growth_stage(self, object):
        return [inst.permalink for inst in object.growth_stage.all()]

    def prepare_has_jobs(self, object):
        return bool(object.jobs.all().count())

    def prepare_jobs_role(self, object):
        return [inst.role for inst in object.jobs.all()]

    def prepare_jobs_position(self, object):
        return [inst.position for inst in object.jobs.all()]

    def prepare_jobs_salary_min(self, object):
        return [inst.salary_min for inst in object.jobs.all()]

    def prepare_jobs_salary_max(self, object):
        return [inst.salary_max for inst in object.jobs.all()]

    def prepare_jobs_skill_set(self, object):

        skill_set = set([])
        for inst in object.jobs.all():
            for skill in inst.skill_set.all():
                skill_set |= set([skill.name])
        return list(skill_set)

    def prepare_popular(self, object):
        return object.popular
コード例 #8
0
ファイル: search_indexes.py プロジェクト: miamitops/pombola
class PersonIndex(BaseIndex, indexes.Indexable):
    name_auto = indexes.EdgeNgramField(model_attr='name')
    hidden = indexes.BooleanField(model_attr='hidden')

    def get_model(self):
        return core_models.Person
コード例 #9
0
class ProductIndex(CelerySearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    condition = indexes.CharField(model_attr='condition', faceted=True)
    category = indexes.MultiValueField(faceted=True)
    location = indexes.MultiValueField(faceted=True)
    variants = indexes.MultiValueField(faceted=True)
    price = indexes.FloatField(model_attr='price', null=True)
    brand = indexes.CharField(model_attr='brand', faceted=True, null=True)
    negotiable = indexes.BooleanField(model_attr='negotiable')
    exchangeable = indexes.BooleanField(model_attr='exchangeable')
    status = indexes.CharField(model_attr='status')
    postedDate = indexes.DateTimeField(model_attr='postedDate')
    title = indexes.CharField(model_attr='title', indexed=False)
    description = indexes.CharField(model_attr='description', indexed=False)
    previewImageURL = indexes.CharField(indexed=False)
    thumbnailImageURL = indexes.CharField(indexed=False)
    geoLocation = indexes.LocationField(null=True)

    def get_model(self):
        return Product

    def prepare_brand(self, obj):
        return obj.brand.name

    def prepare_geoLocation(self, obj):
        locationName = obj.location.name

        @cached_as(Location, extra=locationName)
        def __getCorrdinates():
            payload = {
                'address': locationName,
                'components':
                'country:%s' % settings.GOOGLE_MAP_API_SEARCH_COUNTRY_CODE,
                'key': settings.GOOGLE_MAP_API_KEY
            }
            request = requests.get(settings.GOOGLE_MAP_API_RESUORCE_URL,
                                   params=payload)
            result = request.json()
            if (result["status"] == "OK"):
                lat = request.json(
                )["results"][0]['geometry']['location']["lat"]
                lng = request.json(
                )["results"][0]['geometry']['location']["lng"]
                return "%s,%s" % (lat, lng)
            else:
                return None

        result = __getCorrdinates()
        return result

    def prepare_condition(self, obj):
        return dict(Product.PRODUCT_CONDITIONS).get(obj.condition)

    def prepare_previewImageURL(self, obj):
        productImages = ProductImage.objects.filter(product__pk=obj.pk)
        if productImages:
            firstImage = productImages[0]
            imageToSend = ProductImage.objects.get(pk=firstImage.pk)
            url = imageToSend.image.url
            pathWithoutExtension = url[0:url.find('.') - 1]
            fileExtension = url[url.find('.') + 1:len(url)]
            url = "%s_%s.%s" % (pathWithoutExtension, 'preview', fileExtension)
            return url
        else:
            return 'NONE'

    def prepare_thumbnailImageURL(self, obj):
        productImages = ProductImage.objects.filter(product__pk=obj.pk)
        if productImages:
            firstImage = productImages[0]
            imageToSend = ProductImage.objects.get(pk=firstImage.pk)
            url = imageToSend.image.url
            pathWithoutExtension = url[0:url.find('.') - 1]
            fileExtension = url[url.find('.') + 1:len(url)]
            url = "%s_%s.%s" % (pathWithoutExtension, 'thumbnail',
                                fileExtension)
            return url
        else:
            return 'NONE'

    def prepare_postedDate(self, obj):
        return obj.postedDate.strftime('%Y-%m-%dT%H:%M:%SZ')

    def prepare_category(self, obj):
        output = []
        currentCategory = obj.category
        categoryArray = []
        while (currentCategory is not None):
            categoryArray.append(currentCategory.pk)
            currentCategory = currentCategory.parentCategory

        return categoryArray + [-1]

    def prepare_location(self, obj):
        output = []
        currentLocation = obj.location
        locationArray = []
        while (currentLocation is not None):
            locationArray.append(currentLocation.pk)
            currentLocation = currentLocation.parentLocation

        return locationArray + [-1]

    def prepare_variants(self, obj):
        output = []
        productDataList = ProductData.objects.filter(product__pk=long(obj.pk))
        for productDataItem in productDataList:
            if productDataItem.productAttribute.type in [
                    'CHECKBOX', 'SELECT', 'RADIO'
            ]:
                productDataSelectValues = ProductDataSelectValue.objects.filter(
                    productData__pk=long(productDataItem.pk))
                for productDataSelectItem in productDataSelectValues:
                    output.append('>'.join([
                        str(productDataItem.productAttribute.pk),
                        str(productDataSelectItem.selectValue.pk)
                    ]))
        return output
コード例 #10
0
    specialties = indexes.MultiValueField(
        null=True, model_attr="specialties", faceted=True)

    websites = indexes.MultiValueField(
        null=True, model_attr="websites")

    extra_data = indexes.CharField(
        model_attr="extra_data")

    # When was created the entity and the last modification date
    created_at = indexes.DateTimeField(
        model_attr="created_at", faceted=True)
    updated_at = indexes.DateTimeField(
        model_attr="updated_at", faceted=True)

    is_deleted = indexes.BooleanField(
        model_attr="is_deleted", faceted=True)
    deleted_reason = indexes.CharField(
        model_attr="deleted_reason")

    class Meta:

        text_fields = ["short_description", "long_description", "extra_data"]

        # Once the index has been created it cannot be changed
        # with sync_indexes. Changes should be made by hand.
        index_settings = {
            "realtime": "true",
            "autoCommitTime": "100",
            "ramBufferSize": "2048"
        }
コード例 #11
0
ファイル: Topic.py プロジェクト: WadeBarnes/aries-vcr
class TopicIndex(TxnAwareSearchIndex, indexes.Indexable):
    document = indexes.CharField(document=True)

    topic_source_id = indexes.CharField(model_attr="source_id")
    topic_issuer_id = indexes.IntegerField()
    topic_type_id = indexes.IntegerField()
    topic_inactive = indexes.BooleanField()
    topic_revoked = indexes.BooleanField()
    topic_name = indexes.MultiValueField()
    topic_address = indexes.MultiValueField()
    topic_category = indexes.MultiValueField()
    topic_credential_type_id = indexes.MultiValueField()
    topic_all_credentials_inactive = indexes.BooleanField()
    topic_all_credentials_revoked = indexes.BooleanField()

    def get_model(self):
        return TopicModel

    @staticmethod
    def prepare_topic_issuer_id(obj):
        if obj.foundational_credential:
            return obj.foundational_credential.credential_type.issuer_id
        return None

    @staticmethod
    def prepare_topic_type_id(obj):
        if obj.foundational_credential:
            return obj.foundational_credential.credential_type_id
        return None

    @staticmethod
    def prepare_topic_inactive(obj):
        if obj.foundational_credential:
            return obj.foundational_credential.inactive
        return None

    @staticmethod
    def prepare_topic_revoked(obj):
        if obj.foundational_credential:
            return obj.foundational_credential.revoked
        return None

    @staticmethod
    def prepare_topic_category(obj):
        if obj.foundational_credential:
            return [
                f"{cat.type}::{cat.value}"
                for cat in obj.foundational_credential.all_categories
            ]
        return []

    @staticmethod
    def prepare_topic_name(obj):
        # May need to expand this to inactive credentials
        return [name.text for name in obj.get_active_names()]

    @staticmethod
    def prepare_topic_address(obj):
        # May need to expand this to inactive credentials
        return [
            address.civic_address for address in obj.get_active_addresses()
        ]

    @staticmethod
    def prepare_topic_credential_type_id(obj):
        # May need to expand this to inactive credentials
        credential_type_ids = obj.get_active_credential_type_ids()
        if credential_type_ids:
            return list(credential_type_ids)
        return []

    @staticmethod
    def prepare_topic_all_credentials_inactive(obj):
        all_creds_inactive = True
        for credential in obj.credentials.all():
            if not credential.inactive:
                all_creds_inactive = False
        return all_creds_inactive

    @staticmethod
    def prepare_topic_all_credentials_revoked(obj):
        all_creds_revoked = True
        for credential in obj.credentials.all():
            if not credential.revoked:
                all_creds_revoked = False
        return all_creds_revoked

    def get_updated_field(self):
        return "update_timestamp"
コード例 #12
0
class MediaIndex(indexes.SearchIndex):

    is_public = indexes.BooleanField(default=True)
    datatype = indexes.CharField(model_attr='datatype')

    author = indexes.MultiValueField(faceted=True)
    source = indexes.MultiValueField(faceted=True)
    tag = indexes.MultiValueField(faceted=True)
    taxon = indexes.MultiValueField(faceted=True)
    tour = indexes.MultiValueField()
    reference = indexes.MultiValueField()

    size = indexes.IntegerField(model_attr='size__id', default=0, faceted=True)
    sublocation = indexes.CharField(model_attr='sublocation__id',
                                    default=0,
                                    faceted=True)
    city = indexes.CharField(model_attr='city__id', default=0, faceted=True)
    state = indexes.CharField(model_attr='state__id', default=0, faceted=True)
    country = indexes.CharField(model_attr='country__id',
                                default=0,
                                faceted=True)

    stats__pageviews = indexes.IntegerField(model_attr='stats__pageviews',
                                            default=0)
    timestamp = indexes.DateField(model_attr='timestamp', null=True)
    date = indexes.DateField(model_attr='date', null=True)
    pub_date = indexes.DateField(model_attr='pub_date', null=True)
    id = indexes.IntegerField(model_attr='id')

    highlight = indexes.BooleanField(model_attr='highlight', default=False)

    title_en = indexes.CharField(model_attr='title_en', default='')
    title = indexes.CharField(model_attr='title_pt')

    thumb = indexes.CharField(model_attr='thumb_filepath')
    url = indexes.CharField(model_attr='get_absolute_url')

    def prepare_author(self, media):
        return [author.id for author in media.author_set.all()]
        # "%s##%s" % (author.slug, author.name,) for author in media.author_set.all()]
        # Author.objects.filter(images__pk = object.pk)]

    def prepare_source(self, media):
        return [source.id for source in media.source_set.all()]
        # "%s##%s" % (source.slug, source.name,) for source in media.source_set.all()]
        # Source.objects.filter(images__pk = object.pk)]

    def prepare_tag(self, media):
        return [tag.id for tag in media.tag_set.all()]
        #Tag.objects.filter(images__pk = object.pk)]

    def prepare_taxon(self, media):
        return [taxon.id for taxon in media.taxon_set.all()]
        #Taxon.objects.filter(images__pk = object.pk)]

    def prepare_tour(self, media):
        return [tour.id for tour in media.tour_set.all()]
        #Taxon.objects.filter(images__pk = object.pk)]

    def prepare_reference(self, media):
        return [reference.id for reference in media.reference_set.all()]
        #Taxon.objects.filter(images__pk = object.pk)]

    def index_queryset(self):
        '''Used when the entire index for model is updated.'''
        return self.get_model().objects.filter(is_public=True)
        #select_related('author', 'tag', 'taxon', 'size', 'sublocation', 'city', 'state', 'country', 'rights')

    def prepare(self, obj):
        '''Fetches and adds/alters data before indexing.'''
        self.prepared_data = super(MediaIndex, self).prepare(obj)
        u = type(unicode())
        for key, data in self.prepared_data.items():
            if type(data) == u:
                self.prepared_data[key] = strip_accents(data)
        return self.prepared_data
コード例 #13
0
class EventIndex(indexes.SearchIndex, indexes.Indexable):
    # text: multiple fields use to do full-text search
    text = indexes.MultiValueField(document=True, stored=False)

    title = indexes.CharField(model_attr='title')
    description = indexes.CharField(model_attr='description', null=True)
    slug = indexes.CharField(model_attr='slug', null=False)
    start = indexes.DateTimeField(model_attr='start', faceted=True)
    speakers = indexes.MultiValueField(faceted=True, null=True)
    department = indexes.CharField(faceted=True, null=True)
    location = indexes.CharField(faceted=True, null=True)
    topics = indexes.MultiValueField(faceted=True, null=True)
    is_published = indexes.BooleanField(null=False)
    is_cancelled = indexes.BooleanField(null=False)
    group = indexes.CharField(faceted=True, null=True)
    group_slug = indexes.CharField(null=True)
    lists = indexes.MultiValueField(faceted=True, null=True)

    def get_model(self):
        return Event

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        #return self.get_model().objects.filter(pub_date__lte=datetime.datetime.now())
        return self.get_model().objects.all()

    def prepare(self, obj):
        """Overriding the prepare() method of SearchIndex in order to add our most complicated fields
        It is done in prepare() rather than the individual prepare_FIELD() to avoid having to do
        multiple calls to the APIs...
        """
        self.prepared_data = super(EventIndex, self).prepare(obj)

        topics = obj.api_topics
        topics_pref_labels = []
        topic_alt_labels = []
        if topics:
            for topic in topics:
                topics_pref_labels.append(topic.get('prefLabel', ''))
                topic_alt_labels.extend(topic.get('altLabels', []))
        if obj.department_organiser:
            api_dept = obj.api_organisation
        else:
            api_dept = None
        if obj.location:
            api_loc = obj.api_location
        else:
            api_loc = None
        speakers_names = [speaker.name for speaker in obj.speakers.all()]

        # Speakers
        self.prepared_data[self.speakers.index_fieldname] = speakers_names

        # Department organiser
        if api_dept:
            self.prepared_data[self.department.index_fieldname] = api_dept.get(
                'name', '')

        # Location
        if api_loc:
            self.prepared_data[self.location.index_fieldname] = api_loc.get(
                'name', '')

        # Topics
        if topics_pref_labels:
            self.prepared_data[
                self.topics.index_fieldname] = topics_pref_labels

        # Published status
        self.prepared_data[
            self.is_published.index_fieldname] = obj.is_published
        self.prepared_data[
            self.is_cancelled.index_fieldname] = obj.is_cancelled

        # Series name
        if obj.group:
            self.prepared_data[self.group.index_fieldname] = obj.group.title
            self.prepared_data[
                self.group_slug.index_fieldname] = obj.group.slug

        # lists
        lists_names = [
            list.title
            for list in obj.public_collections_containing_this_event.all()
        ]
        self.prepared_data[self.lists.index_fieldname] = lists_names

        full_text_content = []  # used when searching full text

        if obj.title:
            full_text_content.append(obj.title)
        if obj.description:
            full_text_content.append(obj.description)
        if topics_pref_labels:
            full_text_content.extend(topics_pref_labels)
        if topic_alt_labels:
            full_text_content.extend(topic_alt_labels)
        if obj.group:
            full_text_content.append(obj.group.title)

        full_text_content.extend(speakers_names)

        full_text_content.extend(lists_names)

        self.prepared_data[self.text.index_fieldname] = full_text_content

        return self.prepared_data
コード例 #14
0
ファイル: search_indexes.py プロジェクト: dellamonica/voyages
class VoyageIndex(indexes.SearchIndex, indexes.Indexable):
    """
    Index method for class Voyage.
    """

    # NOTE: To add support for a new language, a simple regular expression seach-and replace
    # can be used to create a variable with the additional language. For instance, the following
    # regular expression adds a language "es" for each variable with language "pt":
    #
    # Search: (.*)lang_pt(.*)
    # Replace: $0\n$1lang_es$2
    #
    # A similar  substitution can be used in schema.xml and managed-schema.xml
    # There you should first create a fieldType for the language (e.g. with
    # stopwords in the matching language).

    text = indexes.CharField(document=True, use_template=True)

    var_imp_voyage_began = indexes.IntegerField(null=True)

    var_voyage_id = indexes.IntegerField(null=True, model_attr='voyage_id')
    var_voyage_in_cd_rom = indexes.BooleanField(null=True, model_attr="voyage_in_cd_rom")
    var_ship_name = indexes.NgramField(null=True, model_attr='voyage_ship__ship_name')
    var_ship_name_plaintext = indexes.CharField(null=True, faceted=True, indexed=True, model_attr='voyage_ship__ship_name')
    var_nationality = indexes.CharField(null=True, model_attr='voyage_ship__nationality_ship__label')
    var_nationality_plaintext = indexes.CharField(null=True, faceted=True, model_attr='voyage_ship__nationality_ship__label')
    var_imputed_nationality = indexes.CharField(null=True, model_attr='voyage_ship__imputed_nationality__label')
    var_imputed_nationality_plaintext = indexes.CharField(null=True, faceted=True, model_attr='voyage_ship__imputed_nationality__label')
    var_vessel_construction_place = indexes.CharField(null=True, model_attr='voyage_ship__vessel_construction_place__place')
    var_vessel_construction_place_lang_en = TranslatedTextField(null=True, model_attr='voyage_ship__vessel_construction_place__place')
    var_vessel_construction_place_lang_pt = TranslatedTextField(null=True, model_attr='voyage_ship__vessel_construction_place__place')
    var_vessel_construction_place_lang_es = TranslatedTextField(null=True, model_attr='voyage_ship__vessel_construction_place__place')
    var_year_of_construction = indexes.IntegerField(null=True, model_attr='voyage_ship__year_of_construction')
    var_registered_place = indexes.CharField(null=True, model_attr='voyage_ship__registered_place__place')
    var_registered_place_lang_en = TranslatedTextField(null=True, model_attr='voyage_ship__registered_place__place')
    var_registered_place_lang_pt = TranslatedTextField(null=True, model_attr='voyage_ship__registered_place__place')
    var_registered_place_lang_es = TranslatedTextField(null=True, model_attr='voyage_ship__registered_place__place')
    var_registered_year = indexes.IntegerField(null=True, model_attr='voyage_ship__registered_year')
    var_rig_of_vessel = indexes.CharField(null=True, model_attr='voyage_ship__rig_of_vessel__label')
    var_rig_of_vessel_plaintext = indexes.CharField(null=True, faceted=True, model_attr='voyage_ship__rig_of_vessel__label')
    var_tonnage = indexes.FloatField(null=True, faceted=True, model_attr='voyage_ship__tonnage')
    var_tonnage_mod = indexes.FloatField(null=True, model_attr='voyage_ship__tonnage_mod')
    var_guns_mounted = indexes.IntegerField(null=True, model_attr='voyage_ship__guns_mounted')
    var_owner = indexes.NgramField(null=True)
    var_owner_plaintext = indexes.CharField(null=True, faceted=True)

    var_nationality_idnum = indexes.IntegerField(null=True, model_attr='voyage_ship__nationality_ship__value')
    var_imputed_nationality_idnum = indexes.IntegerField(null=True, model_attr='voyage_ship__imputed_nationality__value')
    var_vessel_construction_place_idnum = indexes.IntegerField(null=True, model_attr='voyage_ship__vessel_construction_place__value')
    var_registered_place_idnum = indexes.IntegerField(null=True, model_attr='voyage_ship__registered_place__value')
    var_rig_of_vessel_idnum = indexes.IntegerField(null=True, model_attr='voyage_ship__rig_of_vessel__value')

    # Voyage Outcome
    var_outcome_voyage = RelatedCharField(null=True, related_model=VoyageOutcome, model_attr='particular_outcome__label')
    var_outcome_voyage_lang_en = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='particular_outcome__label')
    var_outcome_voyage_lang_pt = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='particular_outcome__label')
    var_outcome_voyage_lang_es = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='particular_outcome__label')
    var_outcome_slaves = RelatedCharField(null=True, related_model=VoyageOutcome, model_attr='outcome_slaves__label')
    var_outcome_slaves_lang_en = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='outcome_slaves__label')
    var_outcome_slaves_lang_pt = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='outcome_slaves__label')
    var_outcome_slaves_lang_es = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='outcome_slaves__label')
    var_outcome_ship_captured = RelatedCharField(null=True, related_model=VoyageOutcome, model_attr='vessel_captured_outcome__label')
    var_outcome_ship_captured_lang_en = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='vessel_captured_outcome__label')
    var_outcome_ship_captured_lang_pt = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='vessel_captured_outcome__label')
    var_outcome_ship_captured_lang_es = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='vessel_captured_outcome__label')
    var_outcome_owner = RelatedCharField(null=True, related_model=VoyageOutcome, model_attr='outcome_owner__label')
    var_outcome_owner_lang_en = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='outcome_owner__label')
    var_outcome_owner_lang_pt = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='outcome_owner__label')
    var_outcome_owner_lang_es = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='outcome_owner__label')
    var_resistance = RelatedCharField(null=True, related_model=VoyageOutcome, model_attr='resistance__label')
    var_resistance_lang_en = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='resistance__label')
    var_resistance_lang_pt = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='resistance__label')
    var_resistance_lang_es = RelatedTranslatedTextField(null=True, related_model=VoyageOutcome, model_attr='resistance__label')

    var_outcome_voyage_idnum = RelatedIntegerField(null=True, related_model=VoyageOutcome, model_attr='particular_outcome__value')
    var_outcome_slaves_idnum = RelatedIntegerField(null=True, related_model=VoyageOutcome, model_attr='outcome_slaves__value')
    var_outcome_ship_captured_idnum = RelatedIntegerField(null=True, related_model=VoyageOutcome, model_attr='vessel_captured_outcome__value')
    var_outcome_owner_idnum = RelatedIntegerField(null=True, related_model=VoyageOutcome, model_attr='outcome_owner__value')
    var_resistance_idnum = RelatedIntegerField(null=True, related_model=VoyageOutcome, model_attr='resistance__value')

    # Voyage itinerary
    var_imp_port_voyage_begin = indexes.CharField(null=True, model_attr='voyage_itinerary__imp_port_voyage_begin__place')
    var_imp_port_voyage_begin_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_port_voyage_begin__place')
    var_imp_port_voyage_begin_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_port_voyage_begin__place')
    var_imp_port_voyage_begin_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_port_voyage_begin__place')
    var_first_place_slave_purchase = indexes.CharField(null=True, model_attr='voyage_itinerary__first_place_slave_purchase__place')
    var_first_place_slave_purchase_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_place_slave_purchase__place')
    var_first_place_slave_purchase_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_place_slave_purchase__place')
    var_first_place_slave_purchase_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_place_slave_purchase__place')
    var_second_place_slave_purchase = indexes.CharField(null=True, model_attr='voyage_itinerary__second_place_slave_purchase__place')
    var_second_place_slave_purchase_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_place_slave_purchase__place')
    var_second_place_slave_purchase_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_place_slave_purchase__place')
    var_second_place_slave_purchase_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_place_slave_purchase__place')
    var_third_place_slave_purchase = indexes.CharField(null=True, model_attr='voyage_itinerary__third_place_slave_purchase__place')
    var_third_place_slave_purchase_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_place_slave_purchase__place')
    var_third_place_slave_purchase_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_place_slave_purchase__place')
    var_third_place_slave_purchase_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_place_slave_purchase__place')
    var_imp_principal_place_of_slave_purchase = indexes.CharField(null=True, model_attr='voyage_itinerary__imp_principal_place_of_slave_purchase__place')
    var_imp_principal_place_of_slave_purchase_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_place_of_slave_purchase__place')
    var_imp_principal_place_of_slave_purchase_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_place_of_slave_purchase__place')
    var_imp_principal_place_of_slave_purchase_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_place_of_slave_purchase__place')
    var_port_of_call_before_atl_crossing = indexes.NgramField(null=True, model_attr='voyage_itinerary__port_of_call_before_atl_crossing__place')
    var_port_of_call_before_atl_crossing_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__port_of_call_before_atl_crossing__place')
    var_port_of_call_before_atl_crossing_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__port_of_call_before_atl_crossing__place')
    var_port_of_call_before_atl_crossing_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__port_of_call_before_atl_crossing__place')
    var_first_landing_place = indexes.CharField(null=True, model_attr='voyage_itinerary__first_landing_place__place')
    var_first_landing_place_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_landing_place__place')
    var_first_landing_place_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_landing_place__place')
    var_first_landing_place_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_landing_place__place')
    var_second_landing_place = indexes.CharField(null=True, model_attr='voyage_itinerary__second_landing_place__place')
    var_second_landing_place_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_landing_place__place')
    var_second_landing_place_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_landing_place__place')
    var_second_landing_place_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_landing_place__place')
    var_third_landing_place = indexes.CharField(null=True, model_attr='voyage_itinerary__third_landing_place__place')
    var_third_landing_place_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_landing_place__place')
    var_third_landing_place_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_landing_place__place')
    var_third_landing_place_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_landing_place__place')
    var_imp_principal_port_slave_dis = indexes.NgramField(null=True, model_attr='voyage_itinerary__imp_principal_port_slave_dis__place')
    var_imp_principal_port_slave_dis_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_port_slave_dis__place')
    var_imp_principal_port_slave_dis_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_port_slave_dis__place')
    var_imp_principal_port_slave_dis_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_port_slave_dis__place')
    var_place_voyage_ended = indexes.CharField(null=True, model_attr='voyage_itinerary__place_voyage_ended__place')
    var_place_voyage_ended_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__place_voyage_ended__place')
    var_place_voyage_ended_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__place_voyage_ended__place')
    var_place_voyage_ended_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__place_voyage_ended__place')

    var_imp_port_voyage_begin_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__imp_port_voyage_begin__value')
    var_first_place_slave_purchase_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__first_place_slave_purchase__value')
    var_second_place_slave_purchase_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__second_place_slave_purchase__value')
    var_third_place_slave_purchase_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__third_place_slave_purchase__value')
    var_imp_principal_place_of_slave_purchase_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__imp_principal_place_of_slave_purchase__value')
    var_port_of_call_before_atl_crossing_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__port_of_call_before_atl_crossing__value')
    var_first_landing_place_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__first_landing_place__value')
    var_second_landing_place_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__second_landing_place__value')
    var_third_landing_place_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__third_landing_place__value')
    var_imp_principal_port_slave_dis_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__imp_principal_port_slave_dis__value')
    var_place_voyage_ended_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__place_voyage_ended__value')

    ## Region variables
    var_imp_region_voyage_begin = indexes.CharField(null=True, model_attr='voyage_itinerary__imp_region_voyage_begin__region')
    var_imp_region_voyage_begin_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_region_voyage_begin__region')
    var_imp_region_voyage_begin_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_region_voyage_begin__region')
    var_imp_region_voyage_begin_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_region_voyage_begin__region')
    var_first_region_slave_emb = indexes.CharField(null=True, model_attr='voyage_itinerary__first_region_slave_emb__region')
    var_first_region_slave_emb_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_region_slave_emb__region')
    var_first_region_slave_emb_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_region_slave_emb__region')
    var_first_region_slave_emb_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_region_slave_emb__region')
    var_second_region_slave_emb = indexes.CharField(null=True, model_attr='voyage_itinerary__second_region_slave_emb__region')
    var_second_region_slave_emb_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_region_slave_emb__region')
    var_second_region_slave_emb_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_region_slave_emb__region')
    var_second_region_slave_emb_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_region_slave_emb__region')
    var_third_region_slave_emb = indexes.CharField(null=True, model_attr='voyage_itinerary__third_region_slave_emb__region')
    var_third_region_slave_emb_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_region_slave_emb__region')
    var_third_region_slave_emb_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_region_slave_emb__region')
    var_third_region_slave_emb_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_region_slave_emb__region')
    var_imp_principal_region_of_slave_purchase = indexes.CharField(null=True, model_attr='voyage_itinerary__imp_principal_region_of_slave_purchase__region')
    var_imp_principal_region_of_slave_purchase_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_region_of_slave_purchase__region')
    var_imp_principal_region_of_slave_purchase_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_region_of_slave_purchase__region')
    var_imp_principal_region_of_slave_purchase_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_region_of_slave_purchase__region')
    var_first_landing_region = indexes.CharField(null=True, model_attr='voyage_itinerary__first_landing_region__region')
    var_first_landing_region_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_landing_region__region')
    var_first_landing_region_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_landing_region__region')
    var_first_landing_region_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__first_landing_region__region')
    var_second_landing_region = indexes.CharField(null=True, model_attr='voyage_itinerary__second_landing_region__region')
    var_second_landing_region_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_landing_region__region')
    var_second_landing_region_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_landing_region__region')
    var_second_landing_region_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__second_landing_region__region')
    var_third_landing_region = indexes.CharField(null=True, model_attr='voyage_itinerary__third_landing_region__region')
    var_third_landing_region_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_landing_region__region')
    var_third_landing_region_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_landing_region__region')
    var_third_landing_region_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__third_landing_region__region')
    var_imp_principal_region_slave_dis = indexes.CharField(null=True, model_attr='voyage_itinerary__imp_principal_region_slave_dis__region')
    var_imp_principal_region_slave_dis_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_region_slave_dis__region')
    var_imp_principal_region_slave_dis_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_region_slave_dis__region')
    var_imp_principal_region_slave_dis_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__imp_principal_region_slave_dis__region')
    var_region_voyage_ended = indexes.CharField(null=True, model_attr='voyage_itinerary__place_voyage_ended__region')
    var_region_voyage_ended_lang_en = TranslatedTextField(null=True, model_attr='voyage_itinerary__place_voyage_ended__region')
    var_region_voyage_ended_lang_pt = TranslatedTextField(null=True, model_attr='voyage_itinerary__place_voyage_ended__region')
    var_region_voyage_ended_lang_es = TranslatedTextField(null=True, model_attr='voyage_itinerary__place_voyage_ended__region')

    var_imp_region_voyage_begin_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__imp_region_voyage_begin__value')
    var_first_region_slave_emb_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__first_region_slave_emb__value')
    var_second_region_slave_emb_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__second_region_slave_emb__value')
    var_third_region_slave_emb_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__third_region_slave_emb__value')
    var_imp_principal_region_of_slave_purchase_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__imp_principal_region_of_slave_purchase__value')
    var_first_landing_region_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__first_landing_region__value')
    var_second_landing_region_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__second_landing_region__value')
    var_imp_principal_region_slave_dis_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__imp_principal_region_slave_dis__value')
    var_region_voyage_ended_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__place_voyage_ended__region__value')

    # Broad Region variables

    var_imp_principal_broad_region_disembark_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__imp_broad_region_slave_dis__value')
    var_imp_broad_region_voyage_begin_idnum = indexes.IntegerField(null=True, model_attr='voyage_itinerary__imp_broad_region_voyage_begin__value')

    # Voyage captain and crew
    var_captain = indexes.NgramField(null=True)
    var_captain_plaintext = indexes.CharField(null=True, faceted=True, indexed=True)
    var_crew_voyage_outset = indexes.IntegerField(null=True, model_attr='voyage_crew__crew_voyage_outset')
    var_crew_first_landing = indexes.IntegerField(null=True, model_attr='voyage_crew__crew_first_landing')
    var_crew_died_complete_voyage = indexes.IntegerField(null=True, model_attr='voyage_crew__crew_died_complete_voyage')

    # Voyage dates
    # Month field is used for filtering by month
    var_imp_arrival_at_port_of_dis = indexes.IntegerField(null=True, faceted=True)
    var_voyage_began = indexes.DateField(null=True)
    var_voyage_began_partial = indexes.CharField(null=True, model_attr='voyage_dates__voyage_began', indexed=True)
    var_voyage_began_month = indexes.IntegerField(null=True)
    var_slave_purchase_began = indexes.DateField(null=True)
    var_slave_purchase_began_partial = indexes.CharField(null=True, model_attr='voyage_dates__slave_purchase_began', indexed=True)
    var_slave_purchase_began_month = indexes.IntegerField(null=True)
    var_date_departed_africa = indexes.DateField(null=True)
    var_date_departed_africa_partial = indexes.CharField(null=True, model_attr='voyage_dates__date_departed_africa', indexed=True)
    var_date_departed_africa_month = indexes.IntegerField(null=True)
    var_first_dis_of_slaves = indexes.DateField(null=True)
    var_first_dis_of_slaves_partial = indexes.CharField(null=True, model_attr='voyage_dates__first_dis_of_slaves', indexed=True)
    var_first_dis_of_slaves_month = indexes.IntegerField(null=True)
    var_departure_last_place_of_landing = indexes.DateField(null=True)
    var_departure_last_place_of_landing_partial = indexes.CharField(null=True, model_attr='voyage_dates__departure_last_place_of_landing', indexed=True)
    var_departure_last_place_of_landing_month = indexes.IntegerField(null=True)
    var_voyage_completed = indexes.DateField(null=True)
    var_voyage_completed_partial = indexes.CharField(null=True, model_attr='voyage_dates__voyage_completed', indexed=True)
    var_voyage_completed_month = indexes.IntegerField(null=True)

    var_imp_length_home_to_disembark = indexes.IntegerField(null=True)
    var_length_middle_passage_days = indexes.IntegerField(null=True, faceted=True)

    # Voyage numbers
    var_num_slaves_intended_first_port = indexes.IntegerField(null=True, model_attr='voyage_slaves_numbers__num_slaves_intended_first_port')
    var_num_slaves_carried_first_port = indexes.IntegerField(null=True, model_attr='voyage_slaves_numbers__num_slaves_carried_first_port')
    var_num_slaves_carried_second_port = indexes.IntegerField(null=True, model_attr='voyage_slaves_numbers__num_slaves_carried_second_port')
    var_num_slaves_carried_third_port = indexes.IntegerField(null=True, model_attr='voyage_slaves_numbers__num_slaves_carried_third_port')
    # To be corrected (copied from previous comment)
    var_total_num_slaves_purchased = indexes.IntegerField(null=True, faceted=True, model_attr='voyage_slaves_numbers__total_num_slaves_dep_last_slaving_port')
    # To be corrected (copied from previous comment)
    var_imp_total_num_slaves_purchased = indexes.IntegerField(null=True, faceted=True, model_attr='voyage_slaves_numbers__imp_total_num_slaves_embarked')
    var_total_num_slaves_arr_first_port_embark = indexes.IntegerField(null=True, model_attr='voyage_slaves_numbers__total_num_slaves_arr_first_port_embark')
    var_num_slaves_disembark_first_place = indexes.IntegerField(null=True, model_attr='voyage_slaves_numbers__num_slaves_disembark_first_place')
    var_num_slaves_disembark_second_place = indexes.IntegerField(null=True, model_attr='voyage_slaves_numbers__num_slaves_disembark_second_place')
    var_num_slaves_disembark_third_place = indexes.IntegerField(null=True, model_attr='voyage_slaves_numbers__num_slaves_disembark_third_place')
    var_imp_total_slaves_disembarked = indexes.IntegerField(null=True, faceted=True, model_attr='voyage_slaves_numbers__imp_total_num_slaves_disembarked')

    # Voyage characteristics
    var_imputed_percentage_men = indexes.FloatField(null=True, model_attr='voyage_slaves_numbers__percentage_men')
    var_imputed_percentage_women = indexes.FloatField(null=True, model_attr='voyage_slaves_numbers__percentage_women')
    var_imputed_percentage_boys = indexes.FloatField(null=True, model_attr='voyage_slaves_numbers__percentage_boy')
    var_imputed_percentage_girls = indexes.FloatField(null=True, model_attr='voyage_slaves_numbers__percentage_girl')
    var_imputed_percentage_female = indexes.FloatField(null=True, model_attr='voyage_slaves_numbers__percentage_female')
    var_imputed_percentage_male = indexes.FloatField(null=True, faceted=True, model_attr='voyage_slaves_numbers__percentage_male')
    var_imputed_percentage_child = indexes.FloatField(null=True, faceted=True, model_attr='voyage_slaves_numbers__percentage_child')
    var_imputed_sterling_cash = indexes.FloatField(null=True, model_attr='voyage_slaves_numbers__imp_jamaican_cash_price')
    var_imputed_death_middle_passage = indexes.IntegerField(null=True, model_attr='voyage_slaves_numbers__imp_mortality_during_voyage')
    var_imputed_mortality = indexes.FloatField(null=True, faceted=True, model_attr='voyage_slaves_numbers__imp_mortality_ratio')

    # Sources
    var_sources = indexes.MultiValueField(indexed=True, stored=True, null=True)
    var_sources_plaintext = indexes.CharField(null=True, faceted=True, indexed=True)
    var_sources_plaintext_search = indexes.NgramField(null=True, faceted=False, indexed=True)
    var_short_ref = indexes.MultiValueField()
    var_long_ref = indexes.CharField(null=True)

    # Links
    var_voyage_links = indexes.MultiValueField(indexed=True, stored=True, null=True)

    # Intra-American vs Trans-Atlantic.
    var_intra_american_voyage = indexes.BooleanField(null=False, indexed=True, model_attr='is_intra_american')

    def get_model(self):
        return Voyage
        
    def get_updated_field(self):
        return 'last_update'

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return Voyage.both_objects.all()

    def prepare_var_imp_voyage_began(self, obj):
        try:
            return getYear(obj.voyage_dates.imp_voyage_began)
        except AttributeError, TypeError:
            return None
コード例 #15
0
ファイル: search_indexes.py プロジェクト: wpapper/geonode
class MapIndex(indexes.SearchIndex, indexes.Indexable):
    id = indexes.IntegerField(model_attr='id')
    abstract = indexes.CharField(model_attr="abstract", boost=1.5)
    category__gn_description = indexes.CharField(
        model_attr="category__gn_description", null=True)
    csw_type = indexes.CharField(model_attr="csw_type")
    csw_wkt_geometry = indexes.CharField(model_attr="csw_wkt_geometry")
    detail_url = indexes.CharField(model_attr="get_absolute_url")
    distribution_description = indexes.CharField(
        model_attr="distribution_description", null=True)
    distribution_url = indexes.CharField(model_attr="distribution_url",
                                         null=True)
    owner__username = indexes.CharField(model_attr="owner",
                                        faceted=True,
                                        null=True)
    popular_count = indexes.IntegerField(model_attr="popular_count",
                                         default=0,
                                         boost=20)
    share_count = indexes.IntegerField(model_attr="share_count", default=0)
    rating = indexes.IntegerField(null=True)
    srid = indexes.CharField(model_attr="srid")
    supplemental_information = indexes.CharField(
        model_attr="supplemental_information", null=True)
    thumbnail_url = indexes.CharField(model_attr="thumbnail_url", null=True)
    uuid = indexes.CharField(model_attr="uuid")
    title = indexes.CharField(model_attr="title", boost=2)
    date = indexes.DateTimeField(model_attr="date")

    text = indexes.EdgeNgramField(document=True,
                                  use_template=True,
                                  stored=False)
    type = indexes.CharField(faceted=True)
    title_sortable = indexes.CharField(indexed=False,
                                       stored=False)  # Necessary for sorting
    category = indexes.CharField(model_attr="category__identifier",
                                 faceted=True,
                                 null=True,
                                 stored=True)
    bbox_left = indexes.FloatField(model_attr="bbox_x0",
                                   null=True,
                                   stored=False)
    bbox_right = indexes.FloatField(model_attr="bbox_x1",
                                    null=True,
                                    stored=False)
    bbox_bottom = indexes.FloatField(model_attr="bbox_y0",
                                     null=True,
                                     stored=False)
    bbox_top = indexes.FloatField(model_attr="bbox_y1",
                                  null=True,
                                  stored=False)
    temporal_extent_start = indexes.DateTimeField(
        model_attr="temporal_extent_start", null=True, stored=False)
    temporal_extent_end = indexes.DateTimeField(
        model_attr="temporal_extent_end", null=True, stored=False)
    keywords = indexes.MultiValueField(model_attr="keyword_slug_list",
                                       null=True,
                                       faceted=True,
                                       stored=True)
    regions = indexes.MultiValueField(model_attr="region_name_list",
                                      null=True,
                                      faceted=True,
                                      stored=True)
    popular_count = indexes.IntegerField(model_attr="popular_count",
                                         default=0,
                                         boost=20)
    share_count = indexes.IntegerField(model_attr="share_count", default=0)
    rating = indexes.IntegerField(null=True)
    num_ratings = indexes.IntegerField(stored=False)
    num_comments = indexes.IntegerField(stored=False)
    # Need to grab the owner's first and last name as well as published status
    owner__first_name = indexes.CharField(model_attr="owner__first_name",
                                          faceted=True,
                                          null=True)
    owner__last_name = indexes.CharField(model_attr="owner__last_name",
                                         faceted=True,
                                         null=True)
    is_published = indexes.BooleanField(model_attr="is_published")
    # Featured status for front page carousel
    featured = indexes.BooleanField(model_attr="featured")

    def get_model(self):
        return Map

    def prepare_type(self, obj):
        return "map"

    def prepare_rating(self, obj):
        ct = ContentType.objects.get_for_model(obj)
        try:
            rating = OverallRating.objects.filter(
                object_id=obj.pk,
                content_type=ct).aggregate(r=Avg("rating"))["r"]
            return float(str(rating or "0"))
        except OverallRating.DoesNotExist:
            return 0.0

    def prepare_num_ratings(self, obj):
        ct = ContentType.objects.get_for_model(obj)
        try:
            return OverallRating.objects.filter(object_id=obj.pk,
                                                content_type=ct).all().count()
        except OverallRating.DoesNotExist:
            return 0

    def prepare_num_comments(self, obj):
        try:
            return Comment.objects.filter(
                object_id=obj.pk,
                content_type=ContentType.objects.get_for_model(
                    obj)).all().count()
        except:
            return 0

    def prepare_title_sortable(self, obj):
        return obj.title.lower()
コード例 #16
0
class BiologicalCollectionIndex(indexes.SearchIndex, indexes.Indexable):
    model_pk = indexes.IntegerField(model_attr='pk')
    id = indexes.CharField()
    text = indexes.CharField(document=True, use_template=True)

    original_species_name = indexes.NgramField(
        model_attr='original_species_name',
        indexed=True
    )

    original_species_name_exact = indexes.CharField(
        model_attr='original_species_name',
        indexed=True
    )

    vernacular_names = indexes.CharField(
        indexed=True
    )

    collector = indexes.NgramField(
        model_attr='collector',
        indexed=True
    )

    collection_date_year = indexes.IntegerField(
        model_attr='collection_date__year',
        indexed=True
    )

    collection_date_month = indexes.IntegerField(
        model_attr='collection_date__month',
        indexed=True
    )

    category = indexes.CharField(
        model_attr='category'
    )

    present = indexes.BooleanField(
        model_attr='present'
    )

    absent = indexes.BooleanField(
        model_attr='absent'
    )

    validated = indexes.BooleanField(
        model_attr='is_validated'
    )

    collection_date = indexes.DateField(
        model_attr='collection_date'
    )

    owner = indexes.CharField(
        model_attr='owner__username'
    )

    notes = indexes.CharField(
        model_attr='notes'
    )

    location_site_name = indexes.CharField(
        model_attr='site__name',
        indexed=True
    )

    location_site_id = indexes.CharField(
        model_attr='site__id'
    )

    location_center = indexes.LocationField()

    location_coordinates = indexes.CharField()

    taxonomy = indexes.IntegerField(indexed=True)

    taxonomy_not_null = indexes.BooleanField(indexed=True)

    taxon_canonical_name = indexes.NgramField(
        model_attr='taxonomy__canonical_name',
        indexed=True
    )

    taxon_scientific_name = indexes.NgramField(
        model_attr='taxonomy__scientific_name',
        indexed=True
    )

    taxon_canonical_name_exact = indexes.CharField(
        model_attr='taxonomy__canonical_name',
        indexed=True
    )

    taxon_scientific_name_exact = indexes.CharField(
        model_attr='taxonomy__scientific_name',
        indexed=True
    )

    taxon_class = indexes.CharField(
        indexed=True
    )

    reference_category = indexes.CharField(
        model_attr='reference_category',
        indexed=True
    )

    reference = indexes.CharField(
        model_attr='reference',
        indexed=True
    )

    site_id_indexed = indexes.IntegerField(
        indexed=True
    )

    endemism = indexes.CharField(
        indexed=True
    )

    iucn_status = indexes.CharField(
        indexed=True
    )

    river_catchments = indexes.CharField(
        indexed=True
    )

    boundary = indexes.CharField(
        indexed=True
    )

    def prepare_taxon_class(self, obj):
        if obj.taxonomy:
            return obj.taxonomy.class_name
        return ''

    def prepare_site_id_indexed(self, obj):
        if obj.site:
            return obj.site.id
        return 0

    def prepare_taxonomy(self, obj):
        if obj.taxonomy:
            return obj.taxonomy.id
        return 0

    def prepare_taxonomy_not_null(self, obj):
        if obj.taxonomy:
            return True
        return False

    def prepare_location_center(self, obj):
        if obj.site:
            return '%s,%s' % obj.site.get_centroid().coords
        return '0,0'

    def prepare_location_coordinates(self, obj):
        if obj.site:
            return '%s,%s' % obj.site.get_centroid().coords
        return '0,0'

    def prepare_boundary(self, obj):
        if not obj.site:
            return ''
        if not obj.site.boundary:
            return ''
        ids = []
        boundary = obj.site.boundary
        while True:
            try:
                ids.append(boundary.id)
                boundary = boundary.top_level_boundary
            except AttributeError:
                break
        return '_' + '_'.join([str(i) for i in ids]) + '_'

    def prepare_endemism(self, obj):
        if not obj.taxonomy:
            return ''
        if not obj.taxonomy.endemism:
            return ''
        return obj.taxonomy.endemism.name

    def prepare_iucn_status(self, obj):
        if not obj.taxonomy:
            return ''
        if not obj.taxonomy.iucn_status:
            return ''
        return obj.taxonomy.iucn_status.category

    def prepare_vernacular_names(self, obj):
        if not obj.taxonomy:
            return ''
        return ','.join(obj.taxonomy.vernacular_names.filter(
            language='eng'
        ).values_list('name', flat=True))

    def prepare_river_catchments(self, obj):
        if not obj.site:
            return ''
        if not obj.site.location_context_document:
            return ''
        river_catchment_array = get_river_catchment_site(obj.site)
        river_catchment_string = ''
        for river_catchment in river_catchment_array:
            river_catchment_string += '_'
            river_catchment_string += river_catchment.replace(' ', '_')
            river_catchment_string += '_'
        return river_catchment_string

    class Meta:
        app_label = 'bims'

    def index_queryset(self, using=None):
        """Used to reindex model"""
        return self.get_model().objects.all()

    def get_model(self):
        return BiologicalCollectionRecord
コード例 #17
0
class NodeIndex(indexes.SearchIndex, indexes.Indexable):
    TYPE_PREFIX = "REFINERY_TYPE"
    NAME_PREFIX = "REFINERY_NAME"
    WORKFLOW_OUTPUT_PREFIX = "REFINERY_WORKFLOW_OUTPUT"
    ANALYSIS_UUID_PREFIX = "REFINERY_ANALYSIS_UUID"
    SUBANALYSIS_PREFIX = "REFINERY_SUBANALYSIS"
    FILETYPE_PREFIX = "REFINERY_FILETYPE"
    DOWNLOAD_URL = "REFINERY_DOWNLOAD_URL_s"

    text = indexes.CharField(document=True, use_template=True)
    uuid = indexes.CharField(model_attr='uuid')
    study_uuid = indexes.CharField(model_attr='study__uuid')
    assay_uuid = indexes.CharField(model_attr='assay__uuid', null=True)
    data_set_uuid = indexes.CharField(null=True)
    type = indexes.CharField(model_attr='type')
    name = indexes.CharField(model_attr='name', null=True)
    file_uuid = indexes.CharField(model_attr='file_uuid', null=True)
    species = indexes.IntegerField(model_attr='species', null=True)
    genome_build = indexes.CharField(model_attr='genome_build', null=True)
    is_annotation = indexes.BooleanField(model_attr='is_annotation')
    analysis_uuid = indexes.CharField(model_attr='analysis_uuid', null=True)
    subanalysis = indexes.IntegerField(model_attr='subanalysis', null=True)
    workflow_output = indexes.CharField(model_attr='workflow_output',
                                        null=True)

    # TODO: add modification date (based on registry)

    def get_model(self):
        return Node

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.all()

    GENERIC_SUFFIX = "_generic_s"

    def _assay_data(self, object):
        data = {}
        for field in Assay._meta.fields:
            if field.name in ['id', 'uuid', 'study', 'file_name']:
                continue
            key = field.name + '_Characteristics' + NodeIndex.GENERIC_SUFFIX
            data[key] = set()
            assay = object.assay
            if assay is not None:
                assay_attr = getattr(assay, field.name)
                if assay_attr is not None:
                    data[key].add(assay_attr)
        return data

    # dynamic fields:
    # https://groups.google.com/forum/?fromgroups#!topic/django-haystack/g39QjTkN-Yg
    # http://stackoverflow.com/questions/7399871/django-haystack-sort-results-by-title
    def prepare(self, object):

        data = super(NodeIndex, self).prepare(object)
        annotations = AnnotatedNode.objects.filter(node=object)
        id_suffix = str(object.study.id)

        try:
            data_set = object.study.get_dataset()
            data['data_set_uuid'] = data_set.uuid
        except RuntimeError as e:
            logger.warn(e)

        if object.assay is not None:
            id_suffix += "_" + str(object.assay.id)

        id_suffix = "_" + id_suffix + "_s"

        data['filename_Characteristics' + NodeIndex.GENERIC_SUFFIX] = \
            re.sub(r'.*/', '', data['name'])

        data.update(self._assay_data(object))

        # create dynamic fields for each attribute
        for annotation in annotations:
            name = annotation.attribute_type
            if annotation.attribute_subtype is not None:
                name = annotation.attribute_subtype + "_" + name

            value = annotation.attribute_value
            if annotation.attribute_value_unit is not None:
                value += " " + annotation.attribute_value_unit

            name = re.sub(r'\W', settings.REFINERY_SOLR_SPACE_DYNAMIC_FIELDS,
                          name)

            uniq_key = name + id_suffix
            generic_key = name + NodeIndex.GENERIC_SUFFIX
            # a node might have multiple parents with different attribute
            # values for a given attribute
            # e.g. parentA Characteristic[cell type] = K562 and
            # parentB Characteristic[cell type] = HeLa
            # child nodes should inherit all attributes of their parents as a
            # concatenation of the unique list
            # old version (only one attribute kept):
            # data[key] = value
            for key in (uniq_key, generic_key):
                if key not in data:
                    data[key] = set()
                if value != "":
                    data[key].add(value)
                else:
                    data[key].add("N/A")
        # iterate over all keys in data and join sets into strings
        for key, value in data.iteritems():
            if type(value) is set:
                data[key] = " + ".join(sorted(value))

        try:
            file_store_item = FileStoreItem.objects.get(uuid=object.file_uuid)
        except (FileStoreItem.DoesNotExist,
                FileStoreItem.MultipleObjectsReturned) as e:
            logger.error("Couldn't properly fetch FileStoreItem: %s", e)
            file_store_item = None

        data.update({
            NodeIndex.DOWNLOAD_URL:
            ''
            if file_store_item is None else file_store_item.get_datafile_url(),
            NodeIndex.TYPE_PREFIX + id_suffix:
            object.type,
            NodeIndex.NAME_PREFIX + id_suffix:
            object.name,
            NodeIndex.FILETYPE_PREFIX + id_suffix:
            "" if file_store_item is None else file_store_item.get_filetype(),
            NodeIndex.ANALYSIS_UUID_PREFIX + id_suffix:
            "N/A"
            if object.get_analysis() is None else object.get_analysis().name,
            NodeIndex.SUBANALYSIS_PREFIX + id_suffix: (
                -1 if object.subanalysis is None  # TODO: upgrade flake8
                else object.subanalysis),  # and remove parentheses
            NodeIndex.WORKFLOW_OUTPUT_PREFIX + id_suffix:
            "N/A" if object.workflow_output is None else object.workflow_output
        })

        return data
コード例 #18
0
class WareAppPrefixInfoIndex(indexes.ModelSearchIndex, indexes.Indexable):
    id = indexes.IntegerField(model_attr='wareApp_key__id')
    name = indexes.CharField(model_attr='wareApp_key__name')
    money = indexes.DecimalField(model_attr='wareApp_key__money')
    image_400x400 = indexes.CharField(model_attr='wareApp_key__image_400x400')
    unix = indexes.CharField(model_attr='wareApp_key__unix')
    stock = indexes.BooleanField(model_attr='wareApp_key__stock')
    release = indexes.BooleanField(model_attr='wareApp_key__release')
    category = indexes.CharField(model_attr='classify_key__name')
    subcategory = indexes.CharField(model_attr='classifythere_key__name')

    brand = indexes.CharField(model_attr='brand_key__PrefixKey__filter_id')
    scene = indexes.CharField(model_attr='scene_key__PrefixKey__filter_id')
    technology = indexes.CharField(
        model_attr='technology_key__PrefixKey__filter_id')
    producttype = indexes.CharField(
        model_attr='producttype_key__PrefixKey__filter_id')
    pricerange = indexes.CharField(
        model_attr='pricerange_key__PrefixKey__filter_id')
    '''
    分离筛选器参数
    '''
    def get_sid_prefix(self, obj, sid):
        name = ''
        if obj.brand_key and int(obj.brand_key.PrefixKey.filter_id) == sid:
            name = '{}.{}'.format(obj.brand_key.PrefixKey.t1,
                                  obj.brand_key.name)
            pass
        if obj.producttype_key and int(
                obj.producttype_key.PrefixKey.filter_id) == sid:
            name = '{}.{}'.format(obj.producttype_key.PrefixKey.t2,
                                  obj.producttype_key.name)
            pass
        if obj.technology_key and int(
                obj.technology_key.PrefixKey.filter_id) == sid:
            name = '{}.{}'.format(obj.technology_key.PrefixKey.t3,
                                  obj.technology_key.name)
            pass
        if obj.scene_key and int(obj.scene_key.PrefixKey.filter_id) == sid:
            name = '{}.{}'.format(obj.scene_key.PrefixKey.t4,
                                  obj.scene_key.name)
            pass
        if obj.pricerange_key and int(
                obj.pricerange_key.PrefixKey.filter_id) == sid:
            name = '{}.{}'.format(obj.pricerange_key.PrefixKey.t5,
                                  obj.pricerange_key.name)
            pass
        return name

    def prepare_image_400x400(self, obj):
        return '{}{}{}'.format(settings.HTTP_HOST, settings.MEDIA,
                               obj.wareApp_key.image_400x400)

    def prepare_brand(self, obj):
        return self.get_sid_prefix(obj, 0)

    def prepare_producttype(self, obj):
        return self.get_sid_prefix(obj, 1)

    def prepare_technology(self, obj):
        return self.get_sid_prefix(obj, 2)

    def prepare_scene(self, obj):
        return self.get_sid_prefix(obj, 3)

    def prepare_pricerange(self, obj):
        return self.get_sid_prefix(obj, 4)

    class Meta:
        model = models.WareAppPrefix

    def index_queryset(self, using=None):
        return self.get_model().objects.filter(wareApp_key__release=True)
コード例 #19
0
class BaseResourceIndex(indexes.SearchIndex, indexes.Indexable):
    """Define base class for resource indexes."""

    text = indexes.CharField(document=True, use_template=True)
    short_id = indexes.CharField(model_attr='short_id')
    doi = indexes.CharField(model_attr='doi', null=True)
    author = indexes.CharField(
        faceted=True)  # normalized to last, first, middle
    author_raw = indexes.CharField(indexed=False)  # not normalized
    author_url = indexes.CharField(indexed=False, null=True)
    title = indexes.CharField()
    abstract = indexes.CharField()
    creator = indexes.MultiValueField(faceted=True)
    contributor = indexes.MultiValueField(faceted=True)
    subject = indexes.MultiValueField(faceted=True)
    availability = indexes.MultiValueField(faceted=True)
    # TODO: We might need more information than a bool in the future
    replaced = indexes.BooleanField()
    created = indexes.DateTimeField(model_attr='created')
    modified = indexes.DateTimeField(model_attr='last_updated')
    organization = indexes.MultiValueField(faceted=True)
    creator_email = indexes.MultiValueField()
    publisher = indexes.CharField(faceted=True)
    rating = indexes.IntegerField(model_attr='rating_sum')
    coverage = indexes.MultiValueField()
    coverage_type = indexes.MultiValueField()
    east = indexes.FloatField(null=True)
    north = indexes.FloatField(null=True)
    northlimit = indexes.FloatField(null=True)
    eastlimit = indexes.FloatField(null=True)
    southlimit = indexes.FloatField(null=True)
    westlimit = indexes.FloatField(null=True)
    start_date = indexes.DateField(null=True)
    end_date = indexes.DateField(null=True)
    storage_type = indexes.CharField()

    # # TODO: SOLR extension needs to be installed for these to work
    # coverage_point = indexes.LocationField(null=True)
    # coverage_southwest = indexes.LocationField(null=True)
    # coverage_northeast = indexes.LocationField(null=True)

    format = indexes.MultiValueField()
    identifier = indexes.MultiValueField()
    language = indexes.CharField(faceted=True)
    source = indexes.MultiValueField()
    relation = indexes.MultiValueField()
    resource_type = indexes.CharField(faceted=True)
    content_type = indexes.MultiValueField(faceted=True)
    comment = indexes.MultiValueField()
    comments_count = indexes.IntegerField(faceted=True)
    owner_login = indexes.MultiValueField(faceted=True)
    owner = indexes.MultiValueField(faceted=True)
    owners_count = indexes.IntegerField(faceted=True)
    # # TODO: We might need these later for social discovery
    # viewer_login = indexes.MultiValueField(faceted=True)
    # viewer = indexes.MultiValueField(faceted=True)
    # viewers_count = indexes.IntegerField(faceted=True)
    # editor_login = indexes.MultiValueField(faceted=True)
    # editor = indexes.MultiValueField(faceted=True)
    # editors_count = indexes.IntegerField(faceted=True)
    person = indexes.MultiValueField(faceted=True)

    # non-core metadata
    geometry_type = indexes.CharField(faceted=True)
    field_name = indexes.CharField()
    field_type = indexes.CharField()
    field_type_code = indexes.CharField()
    variable = indexes.MultiValueField(faceted=True)
    variable_type = indexes.MultiValueField(faceted=True)
    variable_shape = indexes.MultiValueField()
    variable_descriptive_name = indexes.MultiValueField()
    variable_speciation = indexes.MultiValueField()
    site = indexes.MultiValueField()
    method = indexes.MultiValueField()
    quality_level = indexes.MultiValueField()
    data_source = indexes.MultiValueField()
    sample_medium = indexes.MultiValueField(faceted=True)
    units = indexes.MultiValueField(faceted=True)
    units_type = indexes.MultiValueField(faceted=True)
    aggregation_statistics = indexes.MultiValueField()
    absolute_url = indexes.CharField(indexed=False)

    # extra metadata
    extra = indexes.MultiValueField()

    def get_model(self):
        """Return BaseResource model."""
        return BaseResource

    def index_queryset(self, using=None):
        """Return queryset including discoverable and public resources."""
        return self.get_model().objects.filter(
            Q(raccess__discoverable=True) | Q(raccess__public=True))

    def prepare_created(self, obj):
        return obj.created.strftime('%Y-%m-%dT%H:%M:%SZ')

    def prepare_modified(self, obj):
        return obj.last_updated.strftime('%Y-%m-%dT%H:%M:%SZ')

    def prepare_title(self, obj):
        """Return metadata title if exists, otherwise return 'none'."""
        if hasattr(obj, 'metadata') and obj.metadata.title.value is not None:
            return obj.metadata.title.value.lstrip()
        else:
            return 'none'

    def prepare_abstract(self, obj):
        """Return metadata abstract if exists, otherwise return None."""
        if hasattr(obj, 'metadata') and obj.metadata.description is not None and \
                obj.metadata.description.abstract is not None:
            return obj.metadata.description.abstract.lstrip()
        else:
            return None

    def prepare_author_raw(self, obj):
        """
        Return metadata author if exists, otherwise return None.

        This must be represented as a single-value field to enable sorting.
        """
        if hasattr(obj, 'metadata'):
            first_creator = obj.metadata.creators.filter(order=1).first()
            if first_creator.name:
                return first_creator.name.lstrip()
            elif first_creator.organization:
                return first_creator.organization.strip()
            else:
                return 'none'
        else:
            return 'none'

    # TODO: it is confusing that the "author" is the first "creator"
    def prepare_author(self, obj):
        """
        Return first creator if exists, otherwise return empty list.

        This must be represented as a single-value field to enable sorting.
        """
        if hasattr(obj, 'metadata'):
            first_creator = obj.metadata.creators.filter(order=1).first()
            if first_creator.name:
                normalized = normalize_name(first_creator.name)
                return normalized
            elif first_creator.organization:
                return first_creator.organization.strip()
            else:
                return 'none'
        else:
            return 'none'

    def prepare_author_url(self, obj):
        """
        Return metadata author description url if exists, otherwise return None.

        This field is stored but not indexed, to avoid hitting the Django database during response.
        """
        if hasattr(obj, 'metadata'):
            first_creator = obj.metadata.creators.filter(order=1).first()
            if first_creator.description is not None:
                return first_creator.description
            else:
                return None
        else:
            return None

    def prepare_creator(self, obj):
        """
        Return metadata creators if they exist, otherwise return empty array.

        This field can have multiple values
        """
        if hasattr(obj, 'metadata'):
            return [
                normalize_name(creator.name)
                for creator in obj.metadata.creators.all().exclude(
                    name__isnull=True).exclude(name='')
            ]
        else:
            return []

    def prepare_contributor(self, obj):
        """
        Return metadata contributors if they exist, otherwise return empty array.

        This field can have multiple values. Contributors include creators.
        """
        if hasattr(obj, 'metadata'):
            output1 = [
                normalize_name(contributor.name)
                for contributor in obj.metadata.contributors.all().exclude(
                    name__isnull=True).exclude(name='')
            ]
            return list(set(output1))  # eliminate duplicates
        else:
            return []

    def prepare_subject(self, obj):
        """
        Return metadata subjects if they exist, otherwise return empty array.

        This field can have multiple values.
        """
        if hasattr(obj, 'metadata'):
            return [
                subject.value.strip()
                for subject in obj.metadata.subjects.all().exclude(
                    value__isnull=True)
            ]
        else:
            return []

    def prepare_organization(self, obj):
        """
        Return metadata organization if it exists, otherwise return empty array.
        """
        organizations = []
        if hasattr(obj, 'metadata'):
            for creator in obj.metadata.creators.all():
                if (creator.organization is not None):
                    organizations.append(creator.organization.strip())
        return organizations

    def prepare_publisher(self, obj):
        """
        Return metadata publisher if it exists; otherwise return empty array.
        """
        if hasattr(obj, 'metadata'):
            publisher = obj.metadata.publisher
            if publisher is not None:
                return unicode(publisher).lstrip()
            else:
                return None
        else:
            return None

    def prepare_creator_email(self, obj):
        """Return metadata emails if exists, otherwise return empty array."""
        if hasattr(obj, 'metadata'):
            return [
                creator.email.strip()
                for creator in obj.metadata.creators.all().exclude(
                    email__isnull=True).exclude(email='')
            ]
        else:
            return []

    def prepare_availability(self, obj):
        """
        availability is published, public, or discoverable

        To make faceting work properly, all flags that are True are represented.
        """
        options = []
        if hasattr(obj, 'raccess'):
            if obj.raccess.published:
                options.append('published')
            elif obj.raccess.public:
                options.append('public')
            elif obj.raccess.discoverable:
                options.append('discoverable')
            else:
                options.append('private')
        else:
            options.append('private')
        return options

    def prepare_replaced(self, obj):
        """Return True if 'isReplacedBy' attribute exists, otherwise return False."""
        if hasattr(obj, 'metadata'):
            return obj.metadata.relations.all().filter(
                type='isReplacedBy').exists()
        else:
            return False

    def prepare_coverage(self, obj):
        """Return resource coverage if exists, otherwise return empty array."""
        # TODO: reject empty coverages
        if hasattr(obj, 'metadata'):
            return [
                coverage._value.strip()
                for coverage in obj.metadata.coverages.all()
            ]
        else:
            return []

    def prepare_coverage_type(self, obj):
        """
        Return resource coverage types if exists, otherwise return empty array.

        This field can have multiple values.
        """
        if hasattr(obj, 'metadata'):
            return [
                coverage.type.strip()
                for coverage in obj.metadata.coverages.all()
            ]
        else:
            return []

    # TODO: THIS IS SIMPLY THE WRONG WAY TO DO THINGS.
    # Should use geopy Point and Haystack LocationField throughout,
    # instead of encoding limits literally.
    # See http://django-haystack.readthedocs.io/en/v2.6.0/spatial.html

    # TODO: If there are multiple coverage objects with the same type, only first is returned.
    def prepare_east(self, obj):
        """Return resource coverage east bound if exists, otherwise return None."""
        if hasattr(obj, 'metadata'):
            for coverage in obj.metadata.coverages.all():
                if coverage.type == 'point':
                    return float(coverage.value["east"])
                # TODO: this returns the box center, not the extent
                # TODO: probably better to call this something different.
                elif coverage.type == 'box':
                    return (float(coverage.value["eastlimit"]) +
                            float(coverage.value["westlimit"])) / 2
        else:
            return None

    # TODO: If there are multiple coverage objects with the same type, only first is returned.
    def prepare_north(self, obj):
        """Return resource coverage north bound if exists, otherwise return None."""
        if hasattr(obj, 'metadata'):
            for coverage in obj.metadata.coverages.all():
                if coverage.type == 'point':
                    return float(coverage.value["north"])
                # TODO: This returns the box center, not the extent
                elif coverage.type == 'box':
                    return (float(coverage.value["northlimit"]) +
                            float(coverage.value["southlimit"])) / 2
        else:
            return None

    # TODO: If there are multiple coverage objects with the same type, only first is returned.
    def prepare_northlimit(self, obj):
        """Return resource coverage north limit if exists, otherwise return None."""
        if hasattr(obj, 'metadata'):
            # TODO: does not index properly if there are multiple coverages of the same type.
            for coverage in obj.metadata.coverages.all():
                if coverage.type == 'box':
                    return coverage.value["northlimit"]
        else:
            return None

    # TODO: If there are multiple coverage objects with the same type, only first is returned.
    def prepare_eastlimit(self, obj):
        """Return resource coverage east limit if exists, otherwise return None."""
        if hasattr(obj, 'metadata'):
            # TODO: does not index properly if there are multiple coverages of the same type.
            for coverage in obj.metadata.coverages.all():
                if coverage.type == 'box':
                    return coverage.value["eastlimit"]
        else:
            return None

    # TODO: If there are multiple coverage objects with the same type, only first is returned.
    def prepare_southlimit(self, obj):
        """Return resource coverage south limit if exists, otherwise return None."""
        if hasattr(obj, 'metadata'):
            # TODO: does not index properly if there are multiple coverages of the same type.
            for coverage in obj.metadata.coverages.all():
                if coverage.type == 'box':
                    return coverage.value["southlimit"]
        else:
            return None

    # TODO: If there are multiple coverage objects with the same type, only first is returned.
    def prepare_westlimit(self, obj):
        """Return resource coverage west limit if exists, otherwise return None."""
        if hasattr(obj, 'metadata'):
            # TODO: does not index properly if there are multiple coverages of the same type.
            for coverage in obj.metadata.coverages.all():
                if coverage.type == 'box':
                    return coverage.value["westlimit"]
        else:
            return None

    # TODO: time coverages do not specify timezone, and timezone support is active.
    # TODO: Why aren't time coverages specified as Django DateTime objects?
    # TODO: If there are multiple coverage objects with the same type, only first is returned.
    def prepare_start_date(self, obj):
        """Return resource coverage start date if exists, otherwise return None."""
        if hasattr(obj, 'metadata'):
            for coverage in obj.metadata.coverages.all():
                if coverage.type == 'period':
                    clean_date = coverage.value["start"][:10]
                    if "/" in clean_date:
                        parsed_date = clean_date.split("/")
                        start_date = parsed_date[2] + '-' + parsed_date[
                            0] + '-' + parsed_date[1]
                    else:
                        parsed_date = clean_date.split("-")
                        start_date = parsed_date[0] + '-' + parsed_date[
                            1] + '-' + parsed_date[2]
                    start_date = remove_whitespace(
                        start_date)  # no embedded spaces
                    try:
                        start_date_object = datetime.strptime(
                            start_date, '%Y-%m-%d')
                    except ValueError:
                        logger = logging.getLogger(__name__)
                        logger.error(
                            "invalid start date {} in resource {}".format(
                                obj.short_id, start_date))
                        return None
                    return start_date_object
        else:
            return None

    # TODO: time coverages do not specify timezone, and timezone support is active.
    # TODO: Why aren't time coverages specified as Django DateTime objects?
    # TODO: If there are multiple coverage objects with the same type, only first is returned.
    def prepare_end_date(self, obj):
        """Return resource coverage end date if exists, otherwise return None."""
        if hasattr(obj, 'metadata'):
            for coverage in obj.metadata.coverages.all():
                if coverage.type == 'period' and 'end' in coverage.value:
                    clean_date = coverage.value["end"][:10]
                    if "/" in clean_date:
                        parsed_date = clean_date.split("/")
                        end_date = parsed_date[2] + '-' + parsed_date[
                            0] + '-' + parsed_date[1]
                    else:
                        parsed_date = clean_date.split("-")
                        end_date = parsed_date[0] + '-' + parsed_date[
                            1] + '-' + parsed_date[2]
                    end_date = remove_whitespace(
                        end_date)  # no embedded spaces
                    try:
                        end_date_object = datetime.strptime(
                            end_date, '%Y-%m-%d')
                    except ValueError:
                        logger = logging.getLogger(__name__)
                        logger.error(
                            "invalid end date {} in resource {}".format(
                                end_date, obj.short_id))
                        return None
                    return end_date_object
        else:
            return None

    def prepare_storage_type(self, obj):
        return obj.storage_type

    # # TODO: SOLR extension needs to be installed for these to work
    # def prepare_coverage_point(self, obj):
    #     """ Return Point object associated with coverage, or None """
    #     if hasattr(obj, 'metadata'):
    #         for coverage in obj.metadata.coverages.all():
    #             if coverage.type == 'point':
    #                 return Point(float(coverage.value["east"]),
    #                              float(coverage.value["north"]))
    #     return None

    # def prepare_coverage_southwest(self, obj):
    #     """ Return southwest limit of bounding box, or None """
    #     if hasattr(obj, 'metadata'):
    #         for coverage in obj.metadata.coverages.all():
    #             if coverage.type == 'box':
    #                 return Point(float(coverage.value["westlimit"]),
    #                              float(coverage.value["southlimit"]))
    #     return None

    # def prepare_coverage_northeast(self, obj):
    #     """ Return northeast limit of bounding box, or None """
    #     if hasattr(obj, 'metadata'):
    #         for coverage in obj.metadata.coverages.all():
    #             if coverage.type == 'box':
    #                 return Point(float(coverage.value["eastlimit"]),
    #                              float(coverage.value["northlimit"]))
    #     return None

    def prepare_format(self, obj):
        """Return metadata formats if metadata exists, otherwise return empty array."""
        if hasattr(obj, 'metadata'):
            return [
                format.value.strip() for format in obj.metadata.formats.all()
            ]
        else:
            return []

    def prepare_identifier(self, obj):
        """Return metadata identifiers if metadata exists, otherwise return empty array."""
        if hasattr(obj, 'metadata'):
            return [
                identifier.name.strip()
                for identifier in obj.metadata.identifiers.all()
            ]
        else:
            return []

    def prepare_language(self, obj):
        """Return resource language if exists, otherwise return None."""
        if hasattr(obj, 'metadata'):
            return obj.metadata.language.code.strip()
        else:
            return None

    def prepare_source(self, obj):
        """Return resource sources if exists, otherwise return empty array."""
        if hasattr(obj, 'metadata'):
            return [
                source.derived_from.strip()
                for source in obj.metadata.sources.all()
            ]
        else:
            return []

    def prepare_relation(self, obj):
        """Return resource relations if exists, otherwise return empty array."""
        if hasattr(obj, 'metadata'):
            return [
                relation.value.strip()
                for relation in obj.metadata.relations.all()
            ]
        else:
            return []

    def prepare_resource_type(self, obj):
        """Resource type is verbose_name attribute of obj argument."""
        return obj.verbose_name

    def prepare_content_type(self, obj):
        if obj.verbose_name != 'Composite Resource':
            return [obj.discovery_content_type]
        else:
            output = []
            for f in obj.logical_files:
                output.append(f.get_discovery_content_type())
            return output

    def prepare_comment(self, obj):
        """Return list of all comments on resource."""
        return [comment.comment.strip() for comment in obj.comments.all()]

    def prepare_comments_count(self, obj):
        """Return count of resource comments."""
        return obj.comments_count

    def prepare_owner_login(self, obj):
        """Return list of usernames that have ownership access to resource."""
        if hasattr(obj, 'raccess'):
            return [owner.username for owner in obj.raccess.owners.all()]
        else:
            return []

    # TODO: should utilize name from user profile rather than from User field
    def prepare_owner(self, obj):
        """Return list of names of resource owners."""
        names = []
        if hasattr(obj, 'raccess'):
            for owner in obj.raccess.owners.all():
                name = normalize_name(owner.first_name.capitalize() + ' ' +
                                      owner.last_name.capitalize())
                names.append(name)
        return names

    # TODO: should utilize name from user profile rather than from User field
    def prepare_person(self, obj):
        """Return list of normalized names of resource contributors and owners."""
        output0 = []
        output1 = []
        output2 = []
        if hasattr(obj, 'raccess'):
            for owner in obj.raccess.owners.all():
                name = normalize_name(owner.first_name.capitalize() + ' ' +
                                      owner.last_name.capitalize())
                output0.append(name)

        if hasattr(obj, 'metadata'):
            output1 = [
                normalize_name(creator.name)
                for creator in obj.metadata.creators.all().exclude(
                    name__isnull=True).exclude(name='')
            ]
            output2 = [
                normalize_name(contributor.name)
                for contributor in obj.metadata.contributors.all().exclude(
                    name__isnull=True).exclude(name='')
            ]
        return list(set(output0 + output1 + output2))  # eliminate duplicates

    def prepare_owners_count(self, obj):
        """Return count of resource owners if 'raccess' attribute exists, othrerwise return 0."""
        if hasattr(obj, 'raccess'):
            return obj.raccess.owners.all().count()
        else:
            return 0

    # # TODO: We might need these later for social discovery
    # def prepare_viewer_login(self, obj):
    #     """Return usernames of users that can view resource, otherwise return empty array."""
    #     if hasattr(obj, 'raccess'):
    #         return [viewer.username for viewer in obj.raccess.view_users.all()]
    #     else:
    #         return []

    # def prepare_viewer(self, obj):
    #     """Return full names of users that can view resource, otherwise return empty array."""
    #     names = []
    #     if hasattr(obj, 'raccess'):
    #         for viewer in obj.raccess.view_users.all():
    #             name = viewer.last_name + ', ' + viewer.first_name
    #             names.append(name)
    #     return names

    # def prepare_viewers_count(self, obj):
    #     """Return count of users who can view resource, otherwise return 0."""
    #     if hasattr(obj, 'raccess'):
    #         return obj.raccess.view_users.all().count()
    #     else:
    #         return 0

    # def prepare_editor_login(self, obj):
    #     """Return usernames of editors of a resource, otherwise return 0."""
    #     if hasattr(obj, 'raccess'):
    #         return [editor.username for editor in obj.raccess.edit_users.all()]
    #     else:
    #         return 0

    # def prepare_editor(self, obj):
    #     """Return full names of editors of a resource, otherwise return empty array."""
    #     names = []
    #     if hasattr(obj, 'raccess'):
    #         for editor in obj.raccess.edit_users.all():
    #             name = editor.last_name + ', ' + editor.first_name
    #             names.append(name)
    #     return names

    # def prepare_editors_count(self, obj):
    #     """Return count of editors of a resource, otherwise return 0."""
    #     if hasattr(obj, 'raccess'):
    #         return obj.raccess.edit_users.all().count()
    #     else:
    #         return 0

    # TODO: These should probably be multi-value fields and pick up all types.
    def prepare_geometry_type(self, obj):
        """
        Return geometry type if metadata exists, otherwise return [].
        """
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, GeographicFeatureMetaData):
                geometry_info = obj.metadata.geometryinformation
                if geometry_info is not None:
                    return geometry_info.geometryType
                else:
                    return None
            else:
                return None
        else:
            return None

    def prepare_field_name(self, obj):
        """
        Return metadata field name if exists, otherwise return [].
        """
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, GeographicFeatureMetaData):
                field_info = obj.metadata.fieldinformations.all().first()
                if field_info is not None and field_info.fieldName is not None:
                    return field_info.fieldName.strip()
                else:
                    return None
            else:
                return None
        else:
            return None

    def prepare_field_type(self, obj):
        """
        Return metadata field type if exists, otherwise return None.
        """
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, GeographicFeatureMetaData):
                field_info = obj.metadata.fieldinformations.all().first()
                if field_info is not None and field_info.fieldType is not None:
                    return field_info.fieldType.strip()
                else:
                    return None
            else:
                return None
        else:
            return None

    def prepare_field_type_code(self, obj):
        """
        Return metadata field type code if exists, otherwise return [].
        """
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, GeographicFeatureMetaData):
                field_info = obj.metadata.fieldinformations.all().first()
                if field_info is not None and field_info.fieldTypeCode is not None:
                    return field_info.fieldTypeCode.strip()
                else:
                    return None
            else:
                return None
        else:
            return None

    def prepare_variable(self, obj):
        """
        Return metadata variable names if exists, otherwise return empty array.
        """
        variable_names = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, NetcdfMetaData):
                for variable in obj.metadata.variables.all():
                    variable_names.append(variable.name.strip())
            elif isinstance(obj.metadata, RefTSMetadata):
                for variable in obj.metadata.variables.all():
                    variable_names.append(variable.name.strip())
            elif isinstance(obj.metadata, TimeSeriesMetaData):
                for variable in obj.metadata.variables:
                    variable_names.append(variable.variable_name.strip())
        return variable_names

    def prepare_variable_type(self, obj):
        """
        Return metadata variable types if exists, otherwise return empty array.
        """
        variable_types = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, NetcdfMetaData):
                for variable in obj.metadata.variables.all():
                    variable_types.append(variable.type.strip())
            elif isinstance(obj.metadata, RefTSMetadata):
                for variable in obj.metadata.variables.all():
                    variable_types.append(variable.data_type.strip())
            elif isinstance(obj.metadata, TimeSeriesMetaData):
                for variable in obj.metadata.variables:
                    variable_types.append(variable.variable_type.strip())
        return variable_types

    def prepare_variable_shape(self, obj):
        """
        Return metadata variable shapes if exists, otherwise return empty array.
        """
        variable_shapes = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, NetcdfMetaData):
                for variable in obj.metadata.variables.all():
                    if variable.shape is not None:
                        variable_shapes.append(variable.shape.strip())
        return variable_shapes

    def prepare_variable_descriptive_name(self, obj):
        """
        Return metadata variable descriptive names if exists, otherwise return empty array.
        """
        variable_descriptive_names = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, NetcdfMetaData):
                for variable in obj.metadata.variables.all():
                    if variable.descriptive_name is not None:
                        variable_descriptive_names.append(
                            variable.descriptive_name.strip())
        return variable_descriptive_names

    def prepare_variable_speciation(self, obj):
        """
        Return metadata variable speciations if exists, otherwise return empty array.
        """
        variable_speciations = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, TimeSeriesMetaData):
                for variable in obj.metadata.variables:
                    if variable.speciation is not None:
                        variable_speciations.append(
                            variable.speciation.strip())
        return variable_speciations

    def prepare_site(self, obj):
        """
        Return list of sites if exists, otherwise return empty array.
        """
        sites = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, RefTSMetadata):
                for site in obj.metadata.sites.all():
                    if site.name is not None and site.name != '':
                        sites.append(site.name.strip())
            elif isinstance(obj.metadata, TimeSeriesMetaData):
                for site in obj.metadata.sites:
                    if site.site_name is not None and site.site_name != '':
                        sites.append(site.site_name.strip())
        return sites

    def prepare_method(self, obj):
        """
        Return list of methods if exists, otherwise return empty array.
        """
        methods = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, RefTSMetadata):
                for method in obj.metadata.methods.all():
                    if method.description is not None:
                        methods.append(method.description.strip())
            elif isinstance(obj.metadata, TimeSeriesMetaData):
                for method in obj.metadata.methods:
                    if method.method_description is not None:
                        methods.append(method.method_description.strip())
        return methods

    def prepare_quality_level(self, obj):
        """
        Return list of quality levels if exists, otherwise return empty array.
        """
        quality_levels = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, RefTSMetadata):
                for quality_level in obj.metadata.quality_levels.all():
                    if quality_level.code is not None:
                        quality_levels.append(quality_level.code.strip())
        return quality_levels

    def prepare_data_source(self, obj):
        """
        Return list of data sources if exists, otherwise return empty array.
        """
        data_sources = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, RefTSMetadata):
                for data_source in obj.metadata.datasources.all():
                    if data_source.code is not None:
                        data_sources.append(data_source.code.strip())
        return data_sources

    def prepare_sample_medium(self, obj):
        """
        Return list of sample mediums if exists, otherwise return empty array.
        """
        sample_mediums = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, TimeSeriesMetaData):
                for time_series_result in obj.metadata.time_series_results:
                    if time_series_result.sample_medium is not None:
                        sample_mediums.append(time_series_result.sample_medium)
            elif isinstance(obj.metadata, RefTSMetadata):
                for variable in obj.metadata.variables.all():
                    if variable.sample_medium is not None:
                        sample_mediums.append(variable.sample_medium)
        return list(set(sample_mediums))

    def prepare_units(self, obj):
        """
        Return list of units names if exists, otherwise return empty array.
        """
        units_names = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, TimeSeriesMetaData):
                for time_series_result in obj.metadata.time_series_results:
                    if time_series_result.units_name is not None:
                        units_names.append(time_series_result.units_name)
        return units_names

    def prepare_units_type(self, obj):
        """
        Return list of units types if exists, otherwise return empty array.
        """
        units_types = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, TimeSeriesMetaData):
                for time_series_result in obj.metadata.time_series_results:
                    if time_series_result.units_type is not None:
                        units_types.append(
                            time_series_result.units_type.strip())
        return units_types

    def prepare_aggregation_statistics(self, obj):
        """
        Return list of aggregation statistics if exists, otherwise return empty array.
        """
        aggregation_statistics = []
        if hasattr(obj, 'metadata'):
            if isinstance(obj.metadata, TimeSeriesMetaData):
                for time_series_result in obj.metadata.time_series_results:
                    if time_series_result.aggregation_statistics is not None:
                        aggregation_statistics.append(
                            time_series_result.aggregation_statistics)
        return aggregation_statistics

    def prepare_absolute_url(self, obj):
        """Return absolute URL of object."""
        return obj.get_absolute_url()

    def prepare_extra(self, obj):
        """ For extra metadata, include both key and value """
        extra = []
        for key, value in obj.extra_metadata.items():
            extra.append(key + ': ' + value)
        return extra
コード例 #20
0
class BiologicalCollectionIndex(indexes.SearchIndex, indexes.Indexable):
    model_pk = indexes.IntegerField(model_attr='pk')
    id = indexes.CharField()
    text = indexes.CharField(document=True, use_template=True)

    original_species_name = indexes.NgramField(
        model_attr='original_species_name',
        indexed=True
    )

    collector = indexes.NgramField(
        model_attr='collector',
        indexed=True
    )

    collection_date_year = indexes.IntegerField(
        model_attr='collection_date__year',
        indexed=True
    )

    collection_date_month = indexes.IntegerField(
        model_attr='collection_date__month',
        indexed=True
    )

    category = indexes.CharField(
        model_attr='category'
    )

    present = indexes.BooleanField(
        model_attr='present'
    )

    absent = indexes.BooleanField(
        model_attr='absent'
    )

    validated = indexes.BooleanField(
        model_attr='validated'
    )

    collection_date = indexes.DateField(
        model_attr='collection_date'
    )

    owner = indexes.CharField(
        model_attr='owner__username'
    )

    notes = indexes.CharField(
        model_attr='notes'
    )

    location_site_name = indexes.CharField(
        model_attr='site__name'
    )

    location_site_id = indexes.CharField(
        model_attr='site__id'
    )

    location_center = indexes.LocationField()

    taxon_gbif = indexes.IntegerField(indexed=True)

    taxon_gbif_not_null = indexes.BooleanField(indexed=True)

    def prepare_taxon_gbif(self, obj):
        if obj.taxon_gbif_id:
            return obj.taxon_gbif_id.id
        return 0

    def prepare_taxon_gbif_not_null(self, obj):
        if obj.taxon_gbif_id:
            return True
        return False

    def prepare_location_center(self, obj):
        if obj.site:
            return '%s,%s' % obj.site.get_centroid().coords
        return '0,0'

    class Meta:
        app_label = 'bims'

    def index_queryset(self, using=None):
        """Used to reindex model"""
        return self.get_model().objects.all()

    def get_model(self):
        return BiologicalCollectionRecord
コード例 #21
0
class CourseRunIndex(BaseCourseIndex, indexes.Indexable):
    model = CourseRun

    course_key = indexes.CharField(model_attr='course__key', stored=True)
    org = indexes.CharField()
    number = indexes.CharField()
    status = indexes.CharField(model_attr='status', faceted=True)
    start = indexes.DateTimeField(model_attr='start', null=True, faceted=True)
    end = indexes.DateTimeField(model_attr='end', null=True)
    go_live_date = indexes.DateTimeField(model_attr='go_live_date', null=True)
    enrollment_start = indexes.DateTimeField(model_attr='enrollment_start',
                                             null=True)
    enrollment_end = indexes.DateTimeField(model_attr='enrollment_end',
                                           null=True)
    availability = indexes.CharField(model_attr='availability')
    announcement = indexes.DateTimeField(model_attr='announcement', null=True)
    min_effort = indexes.IntegerField(model_attr='min_effort', null=True)
    max_effort = indexes.IntegerField(model_attr='max_effort', null=True)
    weeks_to_complete = indexes.IntegerField(model_attr='weeks_to_complete',
                                             null=True)
    language = indexes.CharField(null=True, faceted=True)
    transcript_languages = indexes.MultiValueField(faceted=True)
    pacing_type = indexes.CharField(model_attr='pacing_type',
                                    null=True,
                                    faceted=True)
    is_marketable = indexes.BooleanField(model_attr='type__is_marketable',
                                         faceted=True)
    marketing_url = indexes.CharField(null=True)
    slug = indexes.CharField(model_attr='slug', null=True)
    seat_types = indexes.MultiValueField(model_attr='seat_types__slug',
                                         null=True,
                                         faceted=True)
    type = indexes.CharField(model_attr='type_legacy', null=True, faceted=True)
    image_url = indexes.CharField(model_attr='image_url', null=True)
    partner = indexes.CharField(null=True, faceted=True)
    program_types = indexes.MultiValueField()
    published = indexes.BooleanField(null=False, faceted=True)
    hidden = indexes.BooleanField(model_attr='hidden', faceted=True)
    mobile_available = indexes.BooleanField(model_attr='mobile_available',
                                            faceted=True)
    authoring_organization_uuids = indexes.MultiValueField()
    staff_uuids = indexes.MultiValueField()
    subject_uuids = indexes.MultiValueField()
    has_enrollable_paid_seats = indexes.BooleanField(null=False)
    first_enrollable_paid_seat_sku = indexes.CharField(null=True)
    first_enrollable_paid_seat_price = indexes.IntegerField(null=True)
    paid_seat_enrollment_end = indexes.DateTimeField(null=True)
    license = indexes.MultiValueField(model_attr='license', faceted=True)
    has_enrollable_seats = indexes.BooleanField(
        model_attr='has_enrollable_seats', null=False)
    is_current_and_still_upgradeable = indexes.BooleanField(null=False)

    def read_queryset(self, using=None):
        # Pre-fetch all fields required by the CourseRunSearchSerializer. Unfortunately, there's
        # no way to specify at query time which queryset to use during loading in order to customize
        # it for the serializer being used
        qset = super(CourseRunIndex, self).read_queryset(using=using)

        return qset.prefetch_related('seats__type', )

    def prepare_aggregation_key(self, obj):
        # Aggregate CourseRuns by Course key since that is how we plan to dedup CourseRuns on the marketing site.
        return 'courserun:{}'.format(obj.course.key)

    def prepare_has_enrollable_paid_seats(self, obj):
        return obj.has_enrollable_paid_seats()

    def prepare_first_enrollable_paid_seat_sku(self, obj):
        return obj.first_enrollable_paid_seat_sku()

    def prepare_first_enrollable_paid_seat_price(self, obj):
        return obj.first_enrollable_paid_seat_price

    def prepare_is_current_and_still_upgradeable(self, obj):
        return obj.is_current_and_still_upgradeable()

    def prepare_paid_seat_enrollment_end(self, obj):
        return obj.get_paid_seat_enrollment_end()

    def prepare_partner(self, obj):
        return obj.course.partner.short_code

    def prepare_published(self, obj):
        return obj.status == CourseRunStatus.Published

    def prepare_language(self, obj):
        return self._prepare_language(obj.language)

    def prepare_number(self, obj):
        course_run_key = CourseKey.from_string(obj.key)
        return course_run_key.course

    def prepare_org(self, obj):
        course_run_key = CourseKey.from_string(obj.key)
        return course_run_key.org

    def prepare_transcript_languages(self, obj):
        return [
            self._prepare_language(language)
            for language in obj.transcript_languages.all()
        ]

    def prepare_marketing_url(self, obj):
        return obj.marketing_url

    def prepare_program_types(self, obj):
        return obj.program_types

    def prepare_staff_uuids(self, obj):
        return [str(staff.uuid) for staff in obj.staff.all()]

    def prepare_subject_uuids(self, obj):
        return [str(subject.uuid) for subject in obj.subjects.all()]
コード例 #22
0
class LayerIndex(indexes.SearchIndex, indexes.Indexable):
    id = indexes.IntegerField()
    abstract = indexes.CharField(model_attr="abstract", boost=1.5)
    category__gn_description = indexes.CharField(
        model_attr="category__gn_description", null=True)
    csw_type = indexes.CharField(model_attr="csw_type")
    csw_wkt_geometry = indexes.CharField(model_attr="csw_wkt_geometry")
    detail_url = indexes.CharField(model_attr="get_absolute_url")
    owner__username = indexes.CharField(model_attr="owner",
                                        faceted=True,
                                        null=True)
    owner__first_name = indexes.CharField(model_attr="owner__first_name",
                                          faceted=True,
                                          null=True)
    owner__last_name = indexes.CharField(model_attr="owner__last_name",
                                         faceted=True,
                                         null=True)
    is_published = indexes.BooleanField(model_attr="is_published")
    featured = indexes.BooleanField(model_attr="featured")
    popular_count = indexes.IntegerField(model_attr="popular_count",
                                         default=0,
                                         boost=20)
    share_count = indexes.IntegerField(model_attr="share_count", default=0)
    rating = indexes.IntegerField(null=True)
    srid = indexes.CharField(model_attr="srid")
    supplemental_information = indexes.CharField(
        model_attr="supplemental_information", null=True)
    thumbnail_url = indexes.CharField(model_attr="thumbnail_url", null=True)
    uuid = indexes.CharField(model_attr="uuid")
    title = indexes.CharField(model_attr="title", boost=2)
    date = indexes.DateTimeField(model_attr="date")

    text = indexes.EdgeNgramField(document=True,
                                  use_template=True,
                                  stored=False)
    type = indexes.CharField(faceted=True)
    subtype = indexes.CharField(faceted=True)
    typename = indexes.CharField(model_attr='typename')
    title_sortable = indexes.CharField(indexed=False,
                                       stored=False)  # Necessary for sorting
    category = indexes.CharField(model_attr="category__identifier",
                                 faceted=True,
                                 null=True,
                                 stored=True)
    bbox_left = indexes.FloatField(model_attr="bbox_x0",
                                   null=True,
                                   stored=False)
    bbox_right = indexes.FloatField(model_attr="bbox_x1",
                                    null=True,
                                    stored=False)
    bbox_bottom = indexes.FloatField(model_attr="bbox_y0",
                                     null=True,
                                     stored=False)
    bbox_top = indexes.FloatField(model_attr="bbox_y1",
                                  null=True,
                                  stored=False)
    temporal_extent_start = indexes.DateTimeField(
        model_attr="temporal_extent_start", null=True, stored=False)
    temporal_extent_end = indexes.DateTimeField(
        model_attr="temporal_extent_end", null=True, stored=False)
    keywords = indexes.MultiValueField(model_attr="keyword_slug_list",
                                       null=True,
                                       faceted=True,
                                       stored=True)
    regions = indexes.MultiValueField(model_attr="region_name_list",
                                      null=True,
                                      faceted=True,
                                      stored=True)
    popular_count = indexes.IntegerField(model_attr="popular_count",
                                         default=0,
                                         boost=20)
    share_count = indexes.IntegerField(model_attr="share_count", default=0)
    rating = indexes.IntegerField(null=True)
    num_ratings = indexes.IntegerField(stored=False)
    num_comments = indexes.IntegerField(stored=False)
    geogig_link = indexes.CharField(null=True)
    has_time = indexes.BooleanField(faceted=True, null=True)

    def get_model(self):
        return Layer

    def prepare_id(self, obj):
        # this is awful I'm so sorry
        if obj.uuid is None or obj.uuid == '':
            return obj.id
        else:
            return int(uuid.UUID(obj.uuid).time_low)

    def prepare_type(self, obj):
        return "layer"

    def prepare_subtype(self, obj):
        if obj.storeType == "dataStore":
            return "vector"
        elif obj.storeType == "coverageStore":
            return "raster"
        elif obj.storeType == "remoteStore":
            return "remote"

    def prepare_rating(self, obj):
        ct = ContentType.objects.get_for_model(obj)
        try:
            rating = OverallRating.objects.filter(
                object_id=obj.pk,
                content_type=ct).aggregate(r=Avg("rating"))["r"]
            return float(str(rating or "0"))
        except OverallRating.DoesNotExist:
            return 0.0

    def prepare_num_ratings(self, obj):
        ct = ContentType.objects.get_for_model(obj)
        try:
            return OverallRating.objects.filter(object_id=obj.pk,
                                                content_type=ct).all().count()
        except OverallRating.DoesNotExist:
            return 0

    def prepare_num_comments(self, obj):
        try:
            return Comment.objects.filter(
                object_id=obj.pk,
                content_type=ContentType.objects.get_for_model(
                    obj)).all().count()
        except:
            return 0

    def prepare_title_sortable(self, obj):
        return obj.title.lower()

    def prepare_geogig_link(self, obj):
        try:
            return obj.geogig_link
        except:
            return None

    # Check to see if either time extent is set on the object,
    # if so, then it is time enabled.
    def prepare_has_time(self, obj):
        try:
            # if either time field is set to a value then time is enabled.
            if (obj.temporal_extent_start is not None
                    or obj.temporal_extent_end is not None):
                return True
        except:
            # when in doubt, it's false.
            return False
コード例 #23
0
class LayerIndex(indexes.SearchIndex, indexes.Indexable):
    id = indexes.IntegerField(model_attr='resourcebase_ptr_id')
    abstract = indexes.CharField(model_attr="abstract", boost=1.5)
    category__gn_description = indexes.CharField(
        model_attr="category__gn_description", null=True)
    csw_type = indexes.CharField(model_attr="csw_type")
    csw_wkt_geometry = indexes.CharField(model_attr="csw_wkt_geometry")
    detail_url = indexes.CharField(model_attr="get_absolute_url")
    owner__username = indexes.CharField(model_attr="owner",
                                        faceted=True,
                                        null=True)
    is_published = indexes.BooleanField(model_attr="is_published")
    featured = indexes.BooleanField(model_attr="featured")
    srid = indexes.CharField(model_attr="srid")
    supplemental_information = indexes.CharField(
        model_attr="supplemental_information", null=True)
    thumbnail_url = indexes.CharField(model_attr="thumbnail_url", null=True)
    uuid = indexes.CharField(model_attr="uuid")
    title = indexes.CharField(model_attr="title", boost=2)
    date = indexes.DateTimeField(model_attr="date")

    text = indexes.EdgeNgramField(document=True,
                                  use_template=True,
                                  stored=False)
    type = indexes.CharField(faceted=True)
    subtype = indexes.CharField(faceted=True)
    alternate = indexes.CharField(model_attr='alternate')
    title_sortable = indexes.CharField(indexed=False,
                                       stored=False)  # Necessary for sorting
    category = indexes.CharField(model_attr="category__identifier",
                                 faceted=True,
                                 null=True,
                                 stored=True)
    bbox_left = indexes.FloatField(model_attr="bbox_x0",
                                   null=True,
                                   stored=False)
    bbox_right = indexes.FloatField(model_attr="bbox_x1",
                                    null=True,
                                    stored=False)
    bbox_bottom = indexes.FloatField(model_attr="bbox_y0",
                                     null=True,
                                     stored=False)
    bbox_top = indexes.FloatField(model_attr="bbox_y1",
                                  null=True,
                                  stored=False)
    temporal_extent_start = indexes.DateTimeField(
        model_attr="temporal_extent_start", null=True, stored=False)
    temporal_extent_end = indexes.DateTimeField(
        model_attr="temporal_extent_end", null=True, stored=False)
    keywords = indexes.MultiValueField(model_attr="keyword_slug_list",
                                       null=True,
                                       faceted=True,
                                       stored=True)
    regions = indexes.MultiValueField(model_attr="region_name_list",
                                      null=True,
                                      faceted=True,
                                      stored=True)
    popular_count = indexes.IntegerField(model_attr="popular_count",
                                         default=0,
                                         boost=20)
    share_count = indexes.IntegerField(model_attr="share_count", default=0)
    rating = indexes.IntegerField(null=True)
    num_ratings = indexes.IntegerField(stored=False)
    num_comments = indexes.IntegerField(stored=False)

    def get_model(self):
        return Dataset

    def prepare_type(self, obj):
        return "layer"

    def prepare_subtype(self, obj):
        if obj.subtype == "vector":
            if obj.has_time:
                return "vector_time"
            else:
                return "vector"
        elif obj.subtype == "raster":
            return "raster"
        elif obj.subtype in ['tileStore', 'remote']:
            return "remote"

    def prepare_rating(self, obj):
        ct = ContentType.objects.get_for_model(obj)
        try:
            rating = OverallRating.objects.filter(
                object_id=obj.pk,
                content_type=ct).aggregate(r=Avg("rating"))["r"]
            return float(str(rating or "0"))
        except OverallRating.DoesNotExist:
            return 0.0

    def prepare_num_ratings(self, obj):
        ct = ContentType.objects.get_for_model(obj)
        try:
            return OverallRating.objects.filter(object_id=obj.pk,
                                                content_type=ct).all().count()
        except OverallRating.DoesNotExist:
            return 0

    def prepare_num_comments(self, obj):
        try:
            return Comment.objects.filter(
                object_id=obj.pk,
                content_type=ContentType.objects.get_for_model(
                    obj)).all().count()
        except Exception:
            return 0

    def prepare_title_sortable(self, obj):
        return obj.title.lower()
コード例 #24
0
class CompanyIndex(BaseSearchIndex, indexes.Indexable):

    _id = indexes.CharField(model_attr="_id")

    user = indexes.CharField(model_attr="user")

    created_at = indexes.DateTimeField(model_attr="created_at")
    updated_at = indexes.DateTimeField(model_attr="updated_at")

    is_deleted = indexes.BooleanField(model_attr="is_deleted")

    name = indexes.CharField(model_attr="name")
    short_description = indexes.CharField(model_attr="short_description")

    round_notes = indexes.CharField(model_attr="round_notes")

    domain = indexes.CharField(model_attr="domain", faceted=True)

    foundation_date = indexes.DateField(model_attr="foundation_date",
                                        faceted=True)

    last_round = indexes.DateField(model_attr="last_round", faceted=True)

    country_code = indexes.CharField(model_attr="country_code", faceted=True)

    stock_symbol = indexes.CharField(model_attr="stock_symbol", faceted=True)

    contact_email = indexes.CharField(model_attr="stock_symbol")

    # Address UDT fields
    address_street_type = indexes.CharField(model_attr="address.street_type")
    address_street_name = indexes.CharField(model_attr="address.street_name")
    address_street_number = \
        indexes.IntegerField(model_attr="address.street_number")
    address_state = indexes.CharField(model_attr="address.state", faceted=True)
    address_region = indexes.CharField(model_attr="address.region",
                                       faceted=True)
    address_city = indexes.CharField(model_attr="address.city", faceted=True)
    address_country_code = indexes.CharField(model_attr="address.country_code",
                                             faceted=True)
    address_zipcode = indexes.CharField(model_attr="address.zipcode",
                                        faceted=True)

    coordinates = indexes.LocationField(model_attr="coordinates")

    founders = indexes.MultiValueField(null=True,
                                       model_attr="founders",
                                       faceted=True)
    specialties = indexes.MultiValueField(null=True,
                                          model_attr="specialties",
                                          faceted=True)
    latest_twitter_followers = indexes.MultiValueField(
        null=True, model_attr="latest_twitter_followers")
    websites = indexes.MultiValueField(null=True, model_attr="websites")

    crawler_config = indexes.CharField(model_attr="crawler_config")
    extra_data = indexes.CharField(model_attr="extra_data")

    class Meta:

        text_fields = ["short_description", "extra_data", "round_notes"]

        # Once the index has been created it cannot be changed
        # with sync_indexes. Changes should be made by hand.
        index_settings = {
            "realtime": "true",
            "autoCommitTime": "100",
            "ramBufferSize": "2048"
        }

    def get_model(self):
        return Company

    def index_queryset(self, using=None):
        return self.get_model().objects.filter(created_at__lte=timezone.now(),
                                               is_deleted=False)

    @staticmethod
    def prepare_autocomplete(obj):
        return " ".join((obj.name, obj.address_city, obj.address_zipcode))
コード例 #25
0
class MediaCollectionIndex(indexes.SearchIndex, indexes.Indexable):

    text = indexes.CharField(document=True, use_template=True)
    item_acces = indexes.CharField(model_attr='public_access', faceted=True)
    item_status = indexes.CharField(model_attr='document_status', faceted=True)
    digitized = indexes.BooleanField(default=False, faceted=True)
    media_type = indexes.CharField(model_attr='media_type',
                                   null='None',
                                   faceted=True)
    recording_context = indexes.CharField(model_attr='recording_context',
                                          default='',
                                          faceted=True)
    physical_format = indexes.CharField(model_attr='physical_format',
                                        default='',
                                        faceted=True)
    #content_auto = indexes.EdgeNgramField(model_attr='content')

    #advance search
    title = indexes.CharField(model_attr='title')
    code = KeywordField(model_attr='code', default='')
    location_principal = indexes.CharField(default='', boost=1.05)
    location_relation = indexes.CharField()
    ethnic_group = indexes.CharField(default='')
    instruments = indexes.CharField(default='')
    collectors = indexes.CharField(model_attr='collector', default='')
    recorded_from_date = indexes.DateField(model_attr='recorded_from_year',
                                           null=True)
    recorded_to_date = indexes.DateField(model_attr='recorded_to_year',
                                         null=True)
    year_published = indexes.IntegerField(model_attr='year_published',
                                          default='')

    def prepare_digitized(self, obj):
        return obj.has_mediafile

    def get_model(self):
        return MediaCollection

    def prepare_location_principal(self, obj):
        collec_location = []
        for item in obj.items.all():
            location = []
            if item.location is not None:
                collec_location.append(item.location.name)
        return u"".join('|' + location for location in collec_location)

    def prepare_location_relation(self, obj):
        collec_location = []
        for item in obj.items.all():
            location = []
            if item.location is not None:
                location_alias = LocationAlias.objects.filter(
                    location__name=item.location)
                location_rela = LocationRelation.objects.filter(
                    location__name=item.location)
                for rela in location_rela:
                    location.append(rela.ancestor_location.name)
                for alias in location_alias:
                    location.append(alias.alias)
                if item.location.current_location is not None:
                    location.append(item.location.current_location.name)
                for name in location:
                    if name and not name in collec_location:
                        collec_location.append(name)
        return u"".join('|' + location for location in collec_location)

    def prepare_ethnic_group(self, obj):
        return "%s" % obj.ethnic_groups()

    def prepare_instruments(self, obj):
        instruments = []
        items = obj.items.all()
        for item in items:
            materials = MediaItemPerformance.objects.all().filter(
                media_item__exact=item)
            for material in materials:
                if material.instrument and not material.instrument in instruments:
                    instruments.append(material.instrument.name)

                if material.alias and not material.alias in instruments:
                    instruments.append(material.alias.name)
        return u"".join('|' + instru for instru in instruments)

    def prepare_recorded_from_date(self, obj):
        if obj.recorded_from_year != 0:
            return datetime.date(int(obj.recorded_from_year), 01, 01)
        else:
            return None

    def prepare_recorded_to_date(self, obj):
        if obj.recorded_to_year != 0:
            return datetime.date(int(obj.recorded_to_year), 01, 01)
        else:
            return None
コード例 #26
0
class DefaultTagObjectIndex(indexes.SearchIndex):
    #mt_location_place = indexes.CharField(model_attr='media_tag__location_place', null=True)
    #mt_people_name = indexes.CharField(model_attr='media_tag__people_name', null=True)
    mt_public = indexes.BooleanField(model_attr='media_tag__public', null=True)
コード例 #27
0
class ActivityPageIndex(indexes.SearchIndex, indexes.Indexable):

    text = indexes.CharField(
        document=True, use_template=True
    )
    date = indexes.DateTimeField(
        model_attr='date'
    )
    summary = indexes.CharField(
        model_attr='summary'
    )
    live = indexes.BooleanField(
        model_attr='live'
    )
    big_idea = indexes.CharField(
        model_attr='big_idea'
    )
    essential_questions = indexes.CharField(
        model_attr='essential_questions'
    )
    objectives = indexes.CharField(
        model_attr='objectives'
    )
    what_students_will_do = indexes.CharField(
        model_attr='what_students_will_do'
    )
    building_block = indexes.MultiValueField(
        model_attr='building_block', faceted=True
    )
    school_subject = indexes.MultiValueField(
        model_attr='school_subject', faceted=True
    )
    topic = indexes.MultiValueField(
        model_attr='topic', faceted=True
    )
    # Audience
    grade_level = indexes.MultiValueField(
        model_attr='grade_level', faceted=True
    )
    age_range = indexes.MultiValueField(
        model_attr='age_range', faceted=True
    )
    student_characteristics = indexes.MultiValueField(
        model_attr='student_characteristics', faceted=True
    )
    # Activity Characteristics
    activity_type = indexes.MultiValueField(
        model_attr='activity_type', faceted=True
    )
    teaching_strategy = indexes.MultiValueField(
        model_attr='teaching_strategy', faceted=True
    )
    blooms_taxonomy_level = indexes.MultiValueField(
        model_attr='blooms_taxonomy_level', faceted=True
    )
    activity_duration = indexes.CharField(
        model_attr='activity_duration', faceted=True
    )
    # Standards taught
    jump_start_coalition = indexes.MultiValueField(
        model_attr='jump_start_coalition', faceted=True
    )
    council_for_economic_education = indexes.MultiValueField(
        model_attr='council_for_economic_education', faceted=True
    )

    def prepare_building_block(self, obj):
        return [item.id for item in obj.building_block.all()]

    def prepare_school_subject(self, obj):
        return [item.id for item in obj.school_subject.all()]

    def prepare_topic(self, obj):
        return [item.id for item in obj.topic.all()]

    def prepare_grade_level(self, obj):
        return [item.id for item in obj.grade_level.all()]

    def prepare_age_range(self, obj):
        return [item.id for item in obj.age_range.all()]

    def prepare_student_characteristics(self, obj):
        return [item.id for item in obj.student_characteristics.all()]

    def prepare_activity_type(self, obj):
        return [item.id for item in obj.activity_type.all()]

    def prepare_teaching_strategy(self, obj):
        return [item.id for item in obj.teaching_strategy.all()]

    def prepare_blooms_taxonomy_level(self, obj):
        return [item.id for item in obj.blooms_taxonomy_level.all()]

    def prepare_activity_duration(self, obj):
        return obj.activity_duration.id

    def prepare_jump_start_coalition(self, obj):
        return [item.id for item in obj.jump_start_coalition.all()]

    def prepare_council_for_economic_education(self, obj):
        return [item.id for item in obj.council_for_economic_education.all()]

    def get_model(self):
        return ActivityPage

    def index_queryset(self, using=None):
        """Only index descendants of the Activity Search page"""
        # This is safe because ActivityIndexPage is a singleton
        search_page = ActivityIndexPage.objects.get()
        return self.get_model().objects.live().descendant_of(search_page)
コード例 #28
0
class SentencesIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True)
    id = indexes.IntegerField(model_attr='id')
    sentence_text = indexes.CharField()
    sentence_text_stemmed = indexes.CharField()
    lang = indexes.CharField(default='und')
    owner = indexes.CharField(default='')
    owner_is_native = indexes.BooleanField(default=False)
    is_orphan = indexes.BooleanField(default=True)
    tags = indexes.CharField(default='')
    is_tagged = indexes.BooleanField(default=False)
    created = indexes.DateTimeField(model_attr='created',
                                    default=datetime(1, 1, 1))
    modified = indexes.DateTimeField(model_attr='modified',
                                     default=datetime(1, 1, 1))
    has_audio = indexes.BooleanField(default=False)
    is_unapproved = indexes.BooleanField(default=False)
    trans_langs = indexes.CharField(default='')
    trans_owners = indexes.CharField(default='')
    trans_has_orphan = indexes.BooleanField(default=False)
    trans_has_audio = indexes.BooleanField(default=False)
    trans_is_unapproved = indexes.BooleanField(default=False)

    def get_model(self):
        return Sentences

    def get_updated_field(self):
        return 'modified'

    def index_queryset(self, using=None):
        return self.get_model().objects.all()

    def prepare(self, object):
        self.prepared_data = super(SentencesIndex, self).prepare(object)

        text = uclean(object.text)
        lang = object.lang
        user = Users.objects.filter(id=object.user_id)
        user = user[0] if user else None
        owner = user.username if user else ''
        owner = uclean(owner)
        is_orphan = not bool(owner)
        owner_is_native = bool(
            UsersLanguages.objects.filter(of_user_id=object.user_id,
                                          by_user_id=object.user_id,
                                          language_code=lang,
                                          level=5).values_list('language_code',
                                                               flat=True))
        tags = Tags.objects.filter(
                    id__in=TagsSentences.objects\
                               .filter(sentence_id=object.id)\
                               .values_list('tag_id', flat=True)\
                    ).values_list('name', flat=True)
        tags = list(set(tags))
        tags = ' | '.join(tags) if tags else ''
        tags = uclean(tags)
        is_tagged = bool(tags)
        is_unapproved = bool(object.correctness == -1)
        has_audio = bool(object.hasaudio == 'shtooka'
                         or object.hasaudio == 'from_users')

        direct_props = list(
            Sentences.objects.raw(
                """
                        SELECT `s`.`id`, `s`.`user_id`, `s`.`lang`, `s`.`correctness`, `s`.`hasaudio`
                        FROM `sentences` as `s`
                        JOIN `sentences_translations` as `t`
                        ON `t`.`translation_id` = `s`.id
                        WHERE `t`.`sentence_id` = %s ;
                        """, [object.id]))
        if direct_props:
            props = defaultdict(set)
            for prop in direct_props:
                for key in ('user_id', 'lang', 'correctness', 'hasaudio'):
                    props[key].add(getattr(prop, key))

            if None in props['lang']:
                props['lang'].remove(None)
                props['lang'].add('und')
            if '' in props['lang']:
                props['lang'].remove('')
                props['lang'].add('und')

            trans_langs = ' | '.join(list(props['lang']))
            trans_is_unapproved = -1 in props['correctness']
            trans_has_orphan = None in props['user_id']
            if trans_has_orphan: props['user_id'].remove(None)
            users = list(props['user_id'])
            users = Users.objects.filter(id__in=users).values_list('username',
                                                                   flat=True)
            trans_owners = ' | '.join(users)
            trans_has_audio = 'shtooka' in props['hasaudio'] or \
                              'from_users' in props['hasaudio']

            self.prepared_data['trans_langs'] = trans_langs
            self.prepared_data['trans_owners'] = trans_owners
            self.prepared_data['trans_has_audio'] = trans_has_audio
            self.prepared_data['trans_is_unapproved'] = trans_is_unapproved
            self.prepared_data['trans_has_orphan'] = trans_has_orphan

        self.prepared_data['sentence_text'] = text
        self.prepared_data['sentence_text_stemmed'] = stemmer.stem(text, lang)
        self.prepared_data['owner'] = owner
        self.prepared_data['is_orphan'] = is_orphan
        self.prepared_data['owner_is_native'] = owner_is_native
        self.prepared_data['tags'] = tags
        self.prepared_data['is_tagged'] = is_tagged
        self.prepared_data['is_unapproved'] = is_unapproved
        self.prepared_data['has_audio'] = has_audio

        return self.prepared_data
コード例 #29
0
class dataroomdirectoryorfileIndex(indexes.SearchIndex, indexes.Indexable):
    """
        dataroomdirectoryorfile索引类
    """
    text = indexes.CharField(document=True, use_template=True)

    # # 保存在索引库中的字段
    id = indexes.IntegerField(model_attr='id')
    dataroom = indexes.IntegerField(model_attr='dataroom_id', null=True)
    bucket = indexes.CharField(model_attr='bucket', null=True)
    parent = indexes.IntegerField(model_attr='parent_id', null=True)
    orderNO = indexes.IntegerField(model_attr='orderNO', null=True)
    size = indexes.IntegerField(model_attr='size', null=True)
    filename = indexes.CharField(model_attr='filename', null=True)
    realfilekey = indexes.CharField(model_attr='realfilekey', null=True)
    key = indexes.CharField(model_attr='key', null=True)
    isFile = indexes.BooleanField(null=True)
    fileContent = indexes.CharField(null=True)
    createuser = indexes.IntegerField(model_attr='createuser_id', null=True)

    def get_model(self):
        """返回建立索引的模型类"""

        return dataroomdirectoryorfile

    def get_updated_field(self):
        return 'lastmodifytime'

    def prepare_fileContent(self, obj):
        """obj 是django里的model实例"""
        filecontent = None
        if obj.isFile and obj.key:
            dataroomPath = os.path.join(APILOG_PATH['es_dataroomPDFPath'],
                                        'dataroom_{}'.format(obj.dataroom_id))
            file_path = os.path.join(dataroomPath, obj.key)
            try:
                if os.path.exists(file_path):
                    filename, type = os.path.splitext(file_path)
                    if type == '.docx':
                        doc = docx.Document(file_path)
                        filecontent = '\n'.join(
                            [paragraph.text for paragraph in doc.paragraphs])
                    elif type == '.doc':
                        filecontent = subprocess.check_output(
                            ["antiword", file_path])
                    elif type == '.pdf':
                        filecontent = getPdfWordContent(file_path)
                    elif type in ['.png', '.jpg', '.jpeg']:
                        filecontent = BaiDuAipGetImageWord(file_path)
                    elif type == '.txt':
                        with open(file_path, "r") as f:
                            text = f.read()
                            type = chardet.detect(text)
                            filecontent = text.decode(type["encoding"],
                                                      'ignore')
            except Exception:
                logexcption(msg='dataroom文件pdf内容提取失败')
        return filecontent

    def index_queryset(self, using=None):
        """返回要建立索引的数据查询集"""
        return self.get_model().objects.filter(is_deleted=False,
                                               dataroom__is_deleted=False,
                                               isFile=True)
コード例 #30
0
ファイル: search_indexes.py プロジェクト: lyjhj/XMLY_2017
class BaseFileIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.NgramField(document=True, use_template=True)
    title = indexes.CharField(model_attr='title')  # 标题u
    pubDate = indexes.DateTimeField(model_attr='pubDate', null=True)  # 出版时间
    creator = indexes.CharField(model_attr='creator', null=True)  # 作者/编者
    keywords = indexes.CharField(model_attr='keywords', null=True)  # 关键字
    check = indexes.BooleanField(model_attr='check', null=True)
    updateDate = indexes.DateTimeField(model_attr='updateDate', null=True)
    # 用于面搜索和精确搜索
    fileType = indexes.MultiValueField()
    fileFormat = indexes.MultiValueField()
    spatial = indexes.MultiValueField()
    discipline = indexes.MultiValueField()
    language = indexes.MultiValueField()  # 需要prepare_language函数做预处理
    subjecttype = indexes.IntegerField(model_attr='subjecttype',
                                       null=True)  # 专题类型

    def get_model(self):
        return FileBaseInfo

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.order_by(
            '-updateDate')  # check=True才检索出来

    def prepare(self, obj):
        data = super(BaseFileIndex, self).prepare(obj)
        if obj.attachment.path.split('/')[-1].split('.')[-1] == 'pdf':
            try:
                extracted_data = search_utils.parse_to_string(
                    obj.attachment.path)  # 文件路径
            except:
                print(obj.filecode)
                extracted_data = ''
        else:
            extracted_data = ''
        t = loader.select_template(
            ('search/indexes/himalaya/filebaseinfo_text.txt', ))
        data['text'] = t.render({'object': obj, 'extracted': extracted_data})
        ext = SubjectTheme.objects.filter(subjectId=obj.subjecttype)
        for item in ext:
            if (int(item.fieldType) == 5 or int(item.fieldType) == 6):
                ex = []
                for key in FileExtendInfo.objects.filter(fieldId=item.id,
                                                         fileId=obj.id):
                    tmp = Category.objects.get(id=int(key.filedValue))
                    val = []
                    while tmp.id != int(item.corrAttri):
                        val.append(tmp.attrName)
                        tmp = Category.objects.get(id=tmp.pid_id)
                    for i in range(1, len(val) + 1):
                        ss = str(i) + '/'
                        for j in range(0, i):
                            if j < i - 1:
                                ss = ss + str(
                                    val[len(val) - 1 - j]).strip() + '/'
                            else:
                                ss = ss + str(val[len(val) - 1 - j]).strip()
                        ex.append(ss)
                    cer = ex[len(ex) - 1].split('/', 1)
                    path = str(int(cer[0]) + 1) + '/' + cer[1] + '/' + val[0]
                    ex.append(path)
            else:
                ex = []
                for key in FileExtendInfo.objects.filter(fieldId=item.id,
                                                         fileId=obj.id):
                    ex.append(key.filedValue)
            if (len(ex) != 0):
                strs = str(item.id) + '_ext'
                data[strs] = ex
        return data

    def prepare_language(self, obj):
        return [lang.lanTypeName for lang in obj.language.all()]

    def prepare_spatial(self, obj):
        return [spa.spcaeTypeName for spa in obj.spatial.all()]

    def prepare_discipline(self, obj):
        return [dis.disciplineTypeName for dis in obj.discipline.all()]

    def prepare_fileFormat(self, obj):
        return [filemat.formatTypeName for filemat in obj.fileFormat.all()]

    def prepare_fileType(self, obj):
        return [file_type.fileTypeName for file_type in obj.fileType.all()]