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 IssueIndex(indexes.ModelSearchIndex, indexes.Indexable): community = IntegerField(model_attr='community_id') is_confidential = BooleanField(model_attr='is_confidential') class Meta: model = Issue fields = ['title', 'abstract'] # Note that regular ``SearchIndex`` methods apply. def index_queryset(self, using=None): "Used when the entire index for model is updated." return Issue.objects.active()
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
class UserIndex(SearchIndex, Indexable): text = CharField(document=True, use_template=True) username = CharField(model_attr='username') exclude_from_competitions = BooleanField( model_attr='userprofile__exclude_from_competitions') avg_integration = FloatField() images = IntegerField() # Total likes of all user's images. likes = IntegerField() # Total likes given to images. likes_given = IntegerField() # Average likes of all user's images. average_likes = FloatField() # Normalized likes (Image Index) normalized_likes = FloatField() # Total likes received on comments. comment_likes_received = IntegerField() # Total likes received on forum posts. forum_post_likes_received = IntegerField() # Total number of likes on all "likeable" elements that can be associated to a user. total_likes_received = IntegerField() # User reputation based on text content # DEPRECATED: remove once contribution_index is populated reputation = FloatField() # Index based on text content contribution_index = FloatField() # Number of followers followers = IntegerField() # Total user integration. integration = FloatField() # Average moon phase under which this user has operated. moon_phase = FloatField() # Total views from all images. views = IntegerField() # Number of bookmarks on own images bookmarks = IntegerField() # Comments received on on own images comments = IntegerField() comments_written = IntegerField() forum_posts = IntegerField() top_pick_nominations = IntegerField() top_picks = IntegerField() iotds = IntegerField() def index_queryset(self, using=None): return self.get_model().objects.all() def get_model(self): return User def get_updated_field(self): return "userprofile__updated" def prepare_images(self, obj): logger.info('Updating UserIndex: %d' % obj.pk) return Image.objects.filter(user=obj).count() def prepare_avg_integration(self, obj): integration = 0 images = 0 for i in Image.objects.filter(user=obj): cached = cache.get(PREPARED_INTEGRATION_CACHE_KEY % i.pk) image_integration = cached if cached is not None else _prepare_integration( i) if image_integration: images += 1 integration += image_integration return (integration / 3600.0) / images if images else 0 def prepare_likes(self, obj): likes = 0 for i in Image.objects.filter(user=obj): cached = cache.get(PREPARED_LIKES_CACHE_KEY % i.pk) likes += cached if cached is not None else _prepare_likes(i) return likes def prepare_likes_given(self, obj): return ToggleProperty.objects.toggleproperties_for_model( 'like', Image, obj).count() def prepare_average_likes(self, obj): likes = self.prepared_data.get('likes') if likes is None: likes = self.prepare_likes(obj) images = self.prepared_data.get('images') if images is None: images = self.prepare_images(obj) return likes / float(images) if images > 0 else 0 def prepare_normalized_likes(self, obj): average = self.prepared_data.get('average_likes') if average is None: average = self.prepare_average_likes(obj) normalized = [] for i in Image.objects.filter(user=obj).iterator(): cached = cache.get(PREPARED_LIKES_CACHE_KEY % i.pk) likes = cached if cached is not None else i.likes() if likes >= average: normalized.append(likes) if len(normalized) == 0: result = 0 else: result = _astrobin_index(normalized) if obj.userprofile.astrobin_index_bonus is not None: result += obj.userprofile.astrobin_index_bonus return result def prepare_comment_likes_received(self, obj): comments = NestedComment.objects.filter(author=obj) likes = 0 for comment in comments.iterator(): likes += ToggleProperty.objects.toggleproperties_for_object( 'like', comment).count() return likes def prepare_forum_post_likes_received(self, obj): posts = Post.objects.filter(user=obj) likes = 0 for post in posts.iterator(): likes += ToggleProperty.objects.toggleproperties_for_object( 'like', post).count() return likes def prepare_total_likes_received(self, obj): likes = self.prepared_data.get('likes') if likes is None: likes = self.prepare_likes(obj) comment_likes_received = self.prepared_data.get( 'comment_likes_received') if comment_likes_received is None: comment_likes_received = self.prepare_comment_likes_received(obj) forum_post_likes_received = self.prepared_data.get( 'forum_post_likes_received') if forum_post_likes_received is None: forum_post_likes_received = self.prepare_forum_post_likes_received( obj) return likes + comment_likes_received + forum_post_likes_received # DEPRECATED: remove once contribution_index is populated def prepare_reputation(self, obj): comments_contribution_index = _prepare_comment_contribution_index( NestedComment.objects.filter(author=obj)) forum_post_contribution_index = _prepare_forum_post_contribution_index( Post.objects.filter(user=obj)) return comments_contribution_index + forum_post_contribution_index def prepare_contribution_index(self, obj): comments_contribution_index = _prepare_comment_contribution_index( NestedComment.objects.filter(author=obj)) forum_post_contribution_index = _prepare_forum_post_contribution_index( Post.objects.filter(user=obj)) return comments_contribution_index + forum_post_contribution_index def prepare_followers(self, obj): return ToggleProperty.objects.filter( property_type="follow", content_type=ContentType.objects.get_for_model(User), object_id=obj.pk).count() def prepare_integration(self, obj): integration = 0 for i in Image.objects.filter(user=obj): cached = cache.get(PREPARED_INTEGRATION_CACHE_KEY % i.pk) integration += cached if cached is not None else _prepare_integration( i) return integration / 3600.0 def prepare_moon_phase(self, obj): l = [] for i in Image.objects.filter(user=obj): cached = cache.get(PREPARED_MOON_PHASE_CACHE_KEY % i.pk) l.append(cached if cached is not None else _prepare_moon_phase(i)) if len(l) == 0: return 0 return reduce(lambda x, y: x + y, l) / len(l) def prepare_views(self, obj): views = 0 for i in Image.objects.filter(user=obj): cached = cache.get(PREPARED_VIEWS_CACHE_KEY % i.pk) views += cached if cached is not None else _prepare_views( i, 'image') return views def prepare_bookmarks(self, obj): bookmarks = 0 for i in Image.objects.filter(user=obj): cached = cache.get(PREPARED_BOOKMARKS_CACHE_KEY % i.pk) bookmarks += cached if cached is not None else _prepare_bookmarks( i) return bookmarks def prepare_comments(self, obj): comments = 0 for i in Image.objects.filter(user=obj): cached = cache.get(PREPARED_COMMENTS_CACHE_KEY % i.pk) comments += cached if cached is not None else _prepare_comments(i) return comments def prepare_comments_written(self, obj): return NestedComment.objects.filter(author=obj, deleted=False).count() def prepare_forum_posts(self, obj): return Post.objects.filter(user=obj).count() def prepare_top_pick_nominations(self, obj): return IotdService().get_top_pick_nominations().filter( image__user=obj).count() def prepare_top_picks(self, obj): return IotdService().get_top_picks().filter(image__user=obj).count() def prepare_iotds(self, obj): return IotdService().get_iotds().filter(image__user=obj).count()