Exemple #1
0
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()
Exemple #2
0
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'
Exemple #3
0
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'
Exemple #4
0
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'
Exemple #5
0
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()
Exemple #6
0
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'),
                            ))
Exemple #7
0
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'),
                            ))
Exemple #8
0
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
Exemple #9
0
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])
Exemple #10
0
class UserIndex(CelerySearchIndex, Indexable):
    text = CharField(document=True, use_template=True)
    images_6m = IntegerField()
    images_1y = IntegerField()
    images = IntegerField()
    avg_integration = FloatField()

    # Total likes of all user's images.
    likes = IntegerField()

    # Total likes of all user's images.
    average_likes_6m = FloatField()
    average_likes_1y = FloatField()
    average_likes = FloatField()

    # Normalized likes (best images only)
    normalized_likes_6m = FloatField()
    normalized_likes_1y = FloatField()
    normalized_likes = FloatField()

    # Number of followers
    followers_6m = IntegerField()
    followers_1y = IntegerField()
    followers = IntegerField()

    # Total user ingegration.
    integration_6m = FloatField()
    integration_1y = FloatField()
    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 = IntegerField()
    comments_written = IntegerField()

    username = CharField(model_attr='username')

    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_6m(self, obj):
        return Image.objects.filter(user=obj).filter(
            uploaded__gte=_6m_ago()).count()

    def prepare_images_1y(self, obj):
        return Image.objects.filter(user=obj).filter(
            uploaded__gte=_1y_ago()).count()

    def prepare_images(self, obj):
        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):
            image_integration = _get_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):
            likes += ToggleProperty.objects.toggleproperties_for_object(
                "like", i).count()
        return likes

    def prepare_likes_6m(self, obj):
        likes = 0
        for i in Image.objects.filter(user=obj, uploaded__gte=_6m_ago()):
            likes += ToggleProperty.objects.toggleproperties_for_object(
                "like", i).count()
        return likes

    def prepare_likes_1y(self, obj):
        likes = 0
        for i in Image.objects.filter(user=obj, uploaded__gte=_1y_ago()):
            likes += ToggleProperty.objects.toggleproperties_for_object(
                "like", i).count()
        return likes

    def prepare_average_likes_6m(self, obj):
        likes = self.prepare_likes_6m(obj)
        images = Image.objects.filter(user=obj,
                                      uploaded__gte=_6m_ago()).count()

        return likes / float(images) if images > 0 else 0

    def prepare_average_likes_1y(self, obj):
        likes = self.prepare_likes_1y(obj)
        images = Image.objects.filter(user=obj,
                                      uploaded__gte=_1y_ago()).count()

        return likes / float(images) if images > 0 else 0

    def prepare_average_likes(self, obj):
        likes = self.prepare_likes(obj)
        images = self.prepare_images(obj)

        return likes / float(images) if images > 0 else 0

    def prepare_normalized_likes_6m(self, obj):
        def average(values):
            if len(values):
                return sum(values) / float(len(values))
            return 0

        def index(values):
            import math
            return average(values) * math.log(len(values) + 1, 10)

        avg = self.prepare_average_likes_6m(obj)
        norm = []

        for i in Image.objects.filter(user=obj).filter(
                uploaded__gte=_6m_ago()):
            likes = i.likes()
            if likes >= avg:
                norm.append(likes)

        if len(norm) == 0:
            return 0

        return index(norm)

    def prepare_normalized_likes_1y(self, obj):
        def average(values):
            if len(values):
                return sum(values) / float(len(values))
            return 0

        def index(values):
            import math
            return average(values) * math.log(len(values) + 1, 10)

        avg = self.prepare_average_likes_1y(obj)
        norm = []

        for i in Image.objects.filter(user=obj).filter(
                uploaded__gte=_1y_ago()):
            likes = i.likes()
            if likes >= avg:
                norm.append(likes)

        if len(norm) == 0:
            return 0

        return index(norm)

    def prepare_normalized_likes(self, obj):
        def average(values):
            if len(values):
                return sum(values) / float(len(values))
            return 0

        def index(values):
            import math
            return average(values) * math.log(len(values) + 1, 10)

        avg = self.prepare_average_likes(obj)
        norm = []

        for i in Image.objects.filter(user=obj):
            likes = i.likes()
            if likes >= avg:
                norm.append(likes)

        if len(norm) == 0:
            return 0

        return index(norm)

    def prepare_followers_6m(self, obj):
        return ToggleProperty.objects.filter(
            property_type="follow",
            content_type=ContentType.objects.get_for_model(User),
            object_id=obj.pk).filter(created_on__gte=_6m_ago()).count()

    def prepare_followers_1y(self, obj):
        return ToggleProperty.objects.filter(
            property_type="follow",
            content_type=ContentType.objects.get_for_model(User),
            object_id=obj.pk).filter(created_on__gte=_1y_ago()).count()

    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_6m(self, obj):
        integration = 0
        for i in Image.objects.filter(user=obj, uploaded__gte=_6m_ago()):
            integration += _get_integration(i)

        return integration / 3600.0

    def prepare_integration_1y(self, obj):
        integration = 0
        for i in Image.objects.filter(user=obj, uploaded__gte=_1y_ago()):
            integration += _get_integration(i)

        return integration / 3600.0

    def prepare_integration(self, obj):
        integration = 0
        for i in Image.objects.filter(user=obj):
            integration += _get_integration(i)

        return integration / 3600.0

    def prepare_moon_phase(self, obj):
        l = []
        for i in Image.objects.filter(user=obj):
            l.append(_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):
            views += _prepare_views(i, 'image')
        return views

    def prepare_bookmarks(self, obj):
        bookmarks = 0
        for i in Image.objects.filter(user=obj):
            bookmarks += _prepare_bookmarks(i)
        return bookmarks

    def prepare_comments(self, obj):
        comments = 0
        for i in Image.objects.filter(user=obj):
            comments += _prepare_comments(i)
        return comments

    def prepare_comments_written(self, obj):
        return NestedComment.objects.filter(author=obj, deleted=False).count()
Exemple #11
0
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
Exemple #12
0
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()
class UserProfileIndex(SearchIndex, Indexable):
    profile_id = IntegerField(indexed=False, model_attr="id")  # used for preparing url
    text = CharField(document=True)
    name = CharField(model_attr="get_full_name")
    course = FacetMultiValueField()
    branch = FacetMultiValueField()
    year_of_graduation = FacetMultiValueField()
    city = FacetCharField()
    state = FacetCharField()
    country = FacetCharField()
    higher_education_degree = FacetMultiValueField()
    higher_education_college = FacetMultiValueField()
    higher_education_college_synonyms = FacetMultiValueField()
    higher_education_college_groups = FacetMultiValueField()
    company = FacetMultiValueField()
    tags = FacetMultiValueField()

    def get_model(self):
        return UserProfile

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

    def prepare_course(self, object):
        return [sc.branch.course.name for sc in object.studentsection_set.all() if sc.branch]

    def prepare_branch(self, object):
        return [sc.branch.name for sc in object.studentsection_set.all() if sc.branch]

    def prepare_year_of_graduation(self, object):
        return [sc.year_of_graduation for sc in object.studentsection_set.all()]

    def prepare_higher_education_degree(self, object):
        return [he.degree.name for he in object.highereducationdetail_set.all() if he.degree]

    def prepare_higher_education_college_synonyms(self, object):
        retval = []
        for he in object.highereducationdetail_set.all():
            if he.college:
                retval.extend([hes.value for hes in Synonym.objects.filter(parent_id=he.college.id,
                                                                          resourcetype=RT_COLLEGE,
                                                                          aliastype=SYNONYM)])
        return retval

    def prepare_higher_education_college_groups(self, object):
        retval = []
        for he in object.highereducationdetail_set.all():
            if he.college:
                retval.extend([hes.value for hes in Synonym.objects.filter(parent_id=he.college.id,
                                                                          resourcetype=RT_COLLEGE,
                                                                          aliastype=GROUP)])
        return retval

    def prepare_higher_education_college(self, object):
        return [he.college.name for he in object.highereducationdetail_set.all() if he.college]

    def prepare_company(self, object):
        return [ed.employer.name for ed in object.employmentdetail_set.all() if ed.employer]

    def prepare_tags(self, object):
        return [tag.name for tag in object.tags.all()]

    def prepare(self, obj):
        prepared_data = super(UserProfileIndex, self).prepare(obj)

        searchable_text = []

        searchable_text.extend(
            [prepared_data['name'], prepared_data['city'], prepared_data['state'],
             prepared_data['country'], ])

        searchable_text.extend([" ".join(prepared_data['course'])])
        searchable_text.extend([" ".join(prepared_data['branch'])])
        searchable_text.extend([" ".join([str(x) for x in prepared_data['year_of_graduation']])])
        searchable_text.extend([" ".join(prepared_data['higher_education_degree'])])
        searchable_text.extend([" ".join(prepared_data['higher_education_college'])])
        searchable_text.extend([" ".join(prepared_data['higher_education_degree'])])
        searchable_text.extend([" ".join(prepared_data['higher_education_college_synonyms'])])
        searchable_text.extend([" ".join(prepared_data['higher_education_college_groups'])])
        searchable_text.extend([" ".join(prepared_data['higher_education_college'])])
        searchable_text.extend([" ".join(prepared_data['company'])])
        searchable_text.extend([" ".join(prepared_data['tags'])])

        prepared_data['text'] = "\n".join([x for x in searchable_text if x is not None])
        print obj.id

        return prepared_data
Exemple #14
0
 def _get_dynamic_fields(self):
     fs = self._fields.copy()
     fs.update({'dynamic_field': IntegerField()})
     return fs