class ForumPostIndex(CelerySearchIndex, Indexable): text = CharField(document=True, use_template=True) created = DateTimeField(model_attr='created') updated = DateTimeField(model_attr='updated', null=True) def get_model(self): return Post def index_queryset(self, using=None): return self.get_model().objects.filter(on_moderation=False)
class NestedCommentIndex(CelerySearchIndex, Indexable): text = CharField(document=True, use_template=True) created = DateTimeField(model_attr='created') updated = DateTimeField(model_attr='updated') def get_model(self): return NestedComment def index_queryset(self, using=None): return self.get_model().objects.filter(deleted=False, image__deleted=None)
class ForumTopicIndex(SearchIndex, Indexable): text = CharField(document=True, use_template=True) created = DateTimeField(model_attr='created') updated = DateTimeField(model_attr='updated', null=True) def get_model(self): return Topic def index_queryset(self, using=None): return self.get_model().objects.filter(on_moderation=False, forum__hidden=False, forum__category__hidden=False) def get_updated_field(self): return "updated"
class DocumentoAcessorioIndex(CelerySearchIndex, Indexable): model = DocumentoAcessorio data = DateTimeField(model_attr='data', null=True) ano = IntegerField(model_attr='ano') text = TextExtractField( document=True, use_template=True, model_attr=( ('arquivo', 'file_extractor'), ('autor', 'string_extractor'), ('ementa', 'string_extractor'), ('indexacao', 'string_extractor'), ) ) def __init__(self, **kwargs): super().__init__(**kwargs) self.text.search_index = self def get_model(self): return self.model def index_queryset(self, using=None): return self.get_model().objects.all() def get_updated_field(self): return 'data_ultima_atualizacao'
class DocumentoAdministrativoIndex(CelerySearchIndex, Indexable): model = DocumentoAdministrativo data = DateTimeField(model_attr='data', null=True) at = IntegerField(model_attr='workspace_id', null=True) ano = IntegerField(model_attr='ano', null=True) text = TextExtractField(document=True, use_template=True, model_attr=( ('__str__', 'string_extractor'), ('texto_integral', 'file_extractor'), ('assunto', 'string_extractor'), ('observacao', 'string_extractor'), )) def __init__(self, **kwargs): super().__init__(**kwargs) self.text.search_index = self def get_model(self): return self.model def index_queryset(self, using=None): return self.get_model().objects.all() def get_updated_field(self): return 'data_ultima_atualizacao'
class SessaoPlenariaIndex(CelerySearchIndex, Indexable): model = SessaoPlenaria data = DateTimeField(model_attr='data_inicio', null=True) ano = IntegerField(model_attr='ano') text = TextExtractField(document=True, use_template=True, model_attr=( ('__str__', 'string_extractor'), ('upload_pauta', 'file_extractor'), ('upload_ata', 'file_extractor'), ('upload_anexo', 'file_extractor'), )) def __init__(self, **kwargs): super().__init__(**kwargs) self.text.search_index = self def get_model(self): return self.model def index_queryset(self, using=None): return self.get_model().objects.all() def get_updated_field(self): return 'data_ultima_atualizacao'
class ProposalIndex(indexes.ModelSearchIndex, indexes.Indexable): text = CharField(document=True, use_template=True) active = BooleanField(model_attr='active') title = CharField(model_attr='title') community = IntegerField(model_attr='issue__community_id') status = IntegerField(model_attr='status') task_completed = BooleanField(model_attr='task_completed') type = IntegerField(model_attr='type') decided_at = DateTimeField() assignee = CharField() due_by = DateField(model_attr='due_by', null=True) is_confidential = BooleanField(model_attr='is_confidential') def get_model(self): return Proposal def prepare_assignee(self, obj): return u'' if not obj.assigned_to_user else \ obj.assigned_to_user.display_name def prepare_decided_at(self, obj): return obj.created_at if not obj.decided_at_meeting \ else obj.decided_at_meeting.held_at # Note that regular ``SearchIndex`` methods apply. def index_queryset(self, using=None): "Used when the entire index for model is updated." return Proposal.objects.active()
class PostIndex(SearchIndex): text = CharField(document=True, model_attr='content', use_template=True) title = CharField(model_attr='title') slug = CharField(model_attr='slug') date_published = DateTimeField(model_attr='date_published') type = CharField(default='post') def get_queryset(self): return Post.objects.published()
class MateriaLegislativaIndex(DocumentoAcessorioIndex): model = MateriaLegislativa tipo = CharField(model_attr='tipo__sigla') ano = IntegerField(model_attr='ano') data = DateTimeField(model_attr='data_apresentacao') text = TextExtractField(document=True, use_template=True, model_attr=( ('texto_original', 'file_extractor'), ('texto_articulado', 'ta_extractor'), ('ementa', 'string_extractor'), ('indexacao', 'string_extractor'), ('observacao', 'string_extractor'), ))
class NormaJuridicaIndex(DocumentoAcessorioIndex): model = NormaJuridica data = DateTimeField(model_attr='data', null=True) tipo = CharField(model_attr='tipo__sigla') ano = IntegerField(model_attr='ano') text = TextExtractField(document=True, use_template=True, model_attr=( ('texto_integral', 'file_extractor'), ('texto_articulado', 'ta_extractor'), ('ementa', 'string_extractor'), ('indexacao', 'string_extractor'), ('observacao', 'string_extractor'), ))
class MultiDateTimeField(MultiValueField): convert_datetime = DateTimeField().convert field_type = 'datetime' def __init__(self, **kwargs): if kwargs.get('facet_class') is None: kwargs['facet_class'] = FacetMultiDateTimeField super(MultiDateTimeField, self).__init__(**kwargs) def convert(self, value): if value is None: return None return [self.convert_datetime(item) for item in value]
class DocumentoIndex(CelerySearchIndex, Indexable): model = Documento data = DateTimeField(model_attr='public_date') ano = IntegerField(model_attr='ano') text = SigadTextExtractField(document=True, use_template=True) def __init__(self, **kwargs): super().__init__(**kwargs) self.text.search_index = self def get_model(self): return self.model def index_queryset(self, using=None): qs = self.get_model().objects.public_all_docs() return qs def get_updated_field(self): return 'modified' def should_update(self, instance): return instance.raiz is None
class ImageIndex(CelerySearchIndex, Indexable): text = CharField(document=True, use_template=True) title = CharField(model_attr='title') description = CharField(model_attr='description', null=True) published = DateTimeField(model_attr='published') uploaded = DateTimeField(model_attr='uploaded') imaging_telescopes = CharField() guiding_telescopes = CharField() mounts = CharField() imaging_cameras = CharField() guiding_cameras = CharField() pixel_scale = FloatField() field_radius = FloatField() countries = CharField() animated = BooleanField(model_attr='animated') likes = IntegerField() integration = FloatField() moon_phase = FloatField() first_acquisition_date = DateTimeField() last_acquisition_date = DateTimeField() views = IntegerField() solar_system_main_subject = IntegerField() is_deep_sky = BooleanField() is_solar_system = BooleanField() is_sun = BooleanField() is_moon = BooleanField() is_planets = BooleanField() is_comets = BooleanField() is_iotd = BooleanField() is_top_pick = BooleanField() license = IntegerField(model_attr='license') min_aperture = IntegerField() max_aperture = IntegerField() min_pixel_size = IntegerField() max_pixel_size = IntegerField() bookmarks = IntegerField() telescope_types = MultiValueField() camera_types = MultiValueField() comments = IntegerField() is_commercial = BooleanField() subject_type = IntegerField(model_attr='subject_type') acquisition_type = CharField(model_attr='acquisition_type') data_source = CharField(model_attr='data_source') remote_source = CharField(model_attr='remote_source', null=True) username = CharField(model_attr='user__username') objects_in_field = CharField() def index_queryset(self, using=None): return self.get_model().objects.filter(moderator_decision=1).exclude( corrupted=True) def get_model(self): return Image def get_updated_field(self): return "updated" def prepare_imaging_telescopes(self, obj): return [ "%s, %s" % (x.get("make"), x.get("name")) for x in obj.imaging_telescopes.all().values('make', 'name') ] def prepare_guiding_telescopes(self, obj): return [ "%s, %s" % (x.get("make"), x.get("name")) for x in obj.guiding_telescopes.all().values('make', 'name') ] def prepare_mounts(self, obj): return [ "%s, %s" % (x.get("make"), x.get("name")) for x in obj.mounts.all().values('make', 'name') ] def prepare_imaging_cameras(self, obj): return [ "%s, %s" % (x.get("make"), x.get("name")) for x in obj.imaging_cameras.all().values('make', 'name') ] def prepare_guiding_cameras(self, obj): return [ "%s, %s" % (x.get("make"), x.get("name")) for x in obj.guiding_cameras.all().values('make', 'name') ] def prepare_pixel_scale(self, obj): return obj.solution.pixscale if obj.solution else None def prepare_field_radius(self, obj): return obj.solution.radius if obj.solution else None def prepare_likes(self, obj): return _prepare_likes(obj) def prepare_integration(self, obj): return _get_integration(obj) def prepare_moon_phase(self, obj): return _prepare_moon_phase(obj) def prepare_first_acquisition_date(self, obj): return _prepare_first_acquisition_date(obj) def prepare_last_acquisition_date(self, obj): return _prepare_last_acquisition_date(obj) def prepare_views(self, obj): return _prepare_views(obj, 'image') def prepare_bookmarks(self, obj): return _prepare_bookmarks(obj) def prepare_telescope_types(self, obj): return _prepare_telescope_types(obj) def prepare_camera_types(self, obj): return _prepare_camera_types(obj) def prepare_comments(self, obj): return _prepare_comments(obj) def prepare_is_commercial(self, obj): commercial_gear = CommercialGear.objects.filter(image=obj) return commercial_gear.count() > 0 def prepare_is_iotd(self, obj): return hasattr(obj, 'iotd') def prepare_is_top_pick(self, obj): return obj.iotdvote_set.count() > 0 and not hasattr(obj, 'iotd') def prepare_objects_in_field(self, obj): return obj.solution.objects_in_field.join(", ") \ if obj.solution and obj.solution.objects_in_field \ else None def prepare_countries(self, obj): return ' '.join([x.country for x in obj.locations.all() if x.country])
class TrapLocationIndex(indexes.SearchIndex, indexes.Indexable): text = CharField(document=True, use_template=True) species_id = CharField(faceted=True) habitat = CharField(faceted=True) school = CharField(faceted=True) observer_name = CharField(faceted=True) species_label = CharField(faceted=True) habitat_label = CharField(faceted=True) school_label = CharField(faceted=True) lat = CharField(faceted=True) lon = CharField(faceted=True) date = DateTimeField(faceted=True) trapped_and_released = BooleanField(faceted=True) observed = BooleanField(faceted=True) camera = BooleanField(faceted=True) tracks_and_signs = BooleanField(faceted=True) unsuccessful = BooleanField(faceted=True) real = BooleanField(faceted=True) asset_type = CharField(faceted=True) def get_model(self): return TrapLocation def prepare_species_id(self, obj): if obj.animal: return obj.animal.species.id else: return None def prepare_habitat(self, obj): if obj.habitat: return obj.habitat.id else: return None def prepare_school(self, obj): if obj.expedition.school: return obj.expedition.school.id else: return None def prepare_habitat_label(self, obj): if obj.habitat: return obj.habitat.label else: return None def prepare_species_label(self, obj): if obj.animal: return obj.animal.species.common_name else: return None def prepare_school_label(self, obj): if obj.expedition.school: return obj.expedition.school.name else: return None def prepare_date(self, obj): return obj.date_for_solr() def prepare_trapped_and_released(self, obj): if obj.animal: return True else: return False def prepare_unsuccessful(self, obj): if obj.animal: return False else: return True def prepare_real(self, obj): return obj.expedition.real def prepare_observer_name(self, obj): return obj.student_names # these are not sightings, so none of these three is applicable: def prepare_observed(self, obj): return None def prepare_camera(self, obj): return None def prepare_tracks_and_signs(self, obj): return None def prepare_lat(self, obj): return obj.actual_lat() def prepare_lon(self, obj): return obj.actual_lon() def prepare_asset_type(self, obj): return obj._meta.object_name
class SightingIndex(indexes.SearchIndex, indexes.Indexable): text = CharField(document=True, use_template=True) species_id = CharField(faceted=True) habitat = CharField(faceted=True) school = CharField(faceted=True) species_label = CharField(faceted=True) habitat_label = CharField(faceted=True) school_label = CharField(faceted=True) observer_name = CharField(faceted=True) date = DateTimeField(faceted=True) lat = CharField(faceted=True) lon = CharField(faceted=True) trapped_and_released = BooleanField(faceted=True) unsuccessful = BooleanField(faceted=True) observed = BooleanField(faceted=True) camera = BooleanField(faceted=True) tracks_and_signs = BooleanField(faceted=True) real = BooleanField(faceted=True) asset_type = CharField(faceted=True) def get_model(self): return Sighting def prepare_name(self, obj): return obj.__unicode__() def prepare_species_id(self, obj): if obj.species: return obj.species.id else: return None def prepare_habitat(self, obj): if obj.habitat: return obj.habitat.id else: return None def prepare_school(self, obj): return None def prepare_habitat_label(self, obj): if obj.habitat: return obj.habitat.label else: return None def prepare_species_label(self, obj): if obj.species: return obj.species.common_name else: return None def prepare_school_label(self, obj): return None def prepare_date(self, obj): return obj.date_for_solr() # these are not traps, so neither of these is applicable: def prepare_trapped_and_released(self, obj): return None def prepare_unsuccessful(self, obj): return None def prepare_real(self, obj): return True def prepare_observed(self, obj): if obj.observation_type and obj.observation_type.label in ['Sighting']: return True else: return False def prepare_camera(self, obj): if (obj.observation_type and obj.observation_type.label in ['Camera-trapped']): return True else: return False def prepare_tracks_and_signs(self, obj): if (obj.observation_type and obj.observation_type.label not in ['Sighting', 'Camera-trapped']): return True else: return False def prepare_asset_type(self, obj): return obj._meta.object_name def prepare_lat(self, obj): return obj.lat() def prepare_lon(self, obj): return obj.lon() def prepare_observer_name(self, obj): return "Black Rock Forest staff"
class ImageIndex(SearchIndex, Indexable): text = CharField(document=True, use_template=True) title = CharField(model_attr='title') description = CharField(model_attr='description', null=True) published = DateTimeField(model_attr='published') uploaded = DateTimeField(model_attr='uploaded') imaging_telescopes = CharField() guiding_telescopes = CharField() mounts = CharField() imaging_cameras = CharField() guiding_cameras = CharField() coord_ra_min = FloatField() coord_ra_max = FloatField() coord_dec_min = FloatField() coord_dec_max = FloatField() pixel_scale = FloatField() field_radius = FloatField() countries = CharField() animated = BooleanField(model_attr='animated') likes = IntegerField() integration = FloatField() moon_phase = FloatField() first_acquisition_date = DateTimeField() last_acquisition_date = DateTimeField() views = IntegerField() solar_system_main_subject_char = CharField( model_attr='solar_system_main_subject', null=True) is_deep_sky = BooleanField() is_solar_system = BooleanField() is_sun = BooleanField() is_moon = BooleanField() is_planets = BooleanField() is_comets = BooleanField() constellation = CharField() is_iotd = BooleanField() is_top_pick = BooleanField() is_top_pick_nomination = BooleanField() license = IntegerField() license_name = CharField() min_aperture = IntegerField() max_aperture = IntegerField() min_pixel_size = IntegerField() max_pixel_size = IntegerField() bookmarks = IntegerField() telescope_types = MultiValueField() camera_types = MultiValueField() comments = IntegerField() subject_type_char = CharField(model_attr='subject_type') acquisition_type = CharField(model_attr='acquisition_type') data_source = CharField(model_attr='data_source') remote_source = CharField(model_attr='remote_source', null=True) username = CharField(model_attr='user__username') objects_in_field = CharField() bortle_scale = FloatField() def index_queryset(self, using=None): return self.get_model().objects.filter(moderator_decision=1).exclude( corrupted=True) def get_model(self): return Image def get_updated_field(self): return "updated" def prepare_imaging_telescopes(self, obj): return [ "%s, %s" % (x.get("make"), x.get("name")) for x in obj.imaging_telescopes.all().values('make', 'name') ] def prepare_guiding_telescopes(self, obj): return [ "%s, %s" % (x.get("make"), x.get("name")) for x in obj.guiding_telescopes.all().values('make', 'name') ] def prepare_mounts(self, obj): return [ "%s, %s" % (x.get("make"), x.get("name")) for x in obj.mounts.all().values('make', 'name') ] def prepare_imaging_cameras(self, obj): return [ "%s, %s" % (x.get("make"), x.get("name")) for x in obj.imaging_cameras.all().values('make', 'name') ] def prepare_guiding_cameras(self, obj): return [ "%s, %s" % (x.get("make"), x.get("name")) for x in obj.guiding_cameras.all().values('make', 'name') ] def prepare_coord_ra_min(self, obj): if obj.solution is not None and obj.solution.ra is not None and obj.solution.radius is not None: return obj.solution.ra - obj.solution.radius return None def prepare_coord_ra_max(self, obj): if obj.solution is not None and obj.solution.ra is not None and obj.solution.radius is not None: return obj.solution.ra + obj.solution.radius return None def prepare_coord_dec_min(self, obj): if obj.solution is not None and obj.solution.dec is not None and obj.solution.radius is not None: return obj.solution.dec - obj.solution.radius return None def prepare_coord_dec_max(self, obj): if obj.solution is not None and obj.solution.dec is not None and obj.solution.radius is not None: return obj.solution.dec + obj.solution.radius return None def prepare_pixel_scale(self, obj): return obj.solution.pixscale if obj.solution else None def prepare_field_radius(self, obj): return obj.solution.radius if obj.solution else None def prepare_likes(self, obj): return _prepare_likes(obj) def prepare_integration(self, obj): return _prepare_integration(obj) def prepare_moon_phase(self, obj): return _prepare_moon_phase(obj) def prepare_first_acquisition_date(self, obj): return _prepare_first_acquisition_date(obj) def prepare_last_acquisition_date(self, obj): return _prepare_last_acquisition_date(obj) def prepare_views(self, obj): return _prepare_views(obj, 'image') def prepare_license(self, obj): return License.to_deprecated_integer(obj.license) def prepare_license_name(self, obj): return obj.license def prepare_bookmarks(self, obj): return _prepare_bookmarks(obj) def prepare_constellation(self, obj): constellation = ImageService.get_constellation(obj.solution) # Escape with __ because And (Andromeda) is not searchable, due to it being the same word as the AND operator. return "__%s__" % constellation.get( 'abbreviation') if constellation else None def prepare_telescope_types(self, obj): return _prepare_telescope_types(obj) def prepare_camera_types(self, obj): return _prepare_camera_types(obj) def prepare_comments(self, obj): return _prepare_comments(obj) def prepare_is_iotd(self, obj): return IotdService().is_iotd(obj) def prepare_is_top_pick(self, obj): return IotdService().is_top_pick( obj) and not IotdService().is_iotd(obj) def prepare_is_top_pick_nomination(self, obj): return IotdService().is_top_pick_nomination(obj) and \ not IotdService().is_top_pick(obj) and \ not IotdService().is_iotd(obj) def prepare_objects_in_field(self, obj): return SolutionService( obj.solution).get_objects_in_field() if obj.solution else None def prepare_countries(self, obj): return ' '.join([x.country for x in obj.locations.all() if x.country]) def prepare_bortle_scale(self, obj): deep_sky_acquisitions = DeepSky_Acquisition.objects.filter( image=obj, bortle__isnull=False) if deep_sky_acquisitions.exists(): return sum([x.bortle for x in deep_sky_acquisitions]) / float( deep_sky_acquisitions.count()) return None