Skip to content

Commit

Permalink
Implement Users page backend (#289)
Browse files Browse the repository at this point in the history
* added

* fixed linting

* made changes in model

* Update backend/apps/github/index/user.py

Co-authored-by: Arkadii Yakovets <[email protected]>

* Update code

* Add key attribute

---------

Co-authored-by: Arkadii Yakovets <[email protected]>
Co-authored-by: Arkadii Yakovets <[email protected]>
  • Loading branch information
3 people authored Dec 31, 2024
1 parent 1d3f3d3 commit e160832
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 1 deletion.
9 changes: 9 additions & 0 deletions backend/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ exec-backend-command:
exec-backend-command-it:
@docker exec -it nest-backend $(CMD) 2>/dev/null

exec-db-command:
@docker exec -it nest-db $(CMD)

clear-cache:
@CMD="poetry run python manage.py clear_cache" $(MAKE) exec-backend-command

Expand Down Expand Up @@ -88,6 +91,12 @@ poetry-update:
purge-data:
@CMD="poetry run python manage.py purge_data" $(MAKE) exec-backend-command

recreate-schema:
@CMD="psql -U nest_user_dev -d nest_db_dev -c \
'DROP SCHEMA public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO nest_user_dev'" \
$(MAKE) exec-db-command 2>/dev/null
$(MAKE) migrate

setup:
@CMD="poetry run python manage.py createsuperuser" $(MAKE) exec-backend-command-it

Expand Down
1 change: 1 addition & 0 deletions backend/apps/github/index/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
"""GitHub app models index."""

from apps.github.index.issue import IssueIndex
from apps.github.index.user import UserIndex
66 changes: 66 additions & 0 deletions backend/apps/github/index/user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
"""GitHub user Algolia index configuration."""

from algoliasearch_django import AlgoliaIndex
from algoliasearch_django.decorators import register

from apps.common.index import IndexBase
from apps.github.models.user import User


@register(User)
class UserIndex(AlgoliaIndex, IndexBase):
"""User index."""

index_name = "users"

fields = (
"idx_avatar_url",
"idx_bio",
"idx_company",
"idx_created_at",
"idx_email",
"idx_followers_count",
"idx_following_count",
"idx_key",
"idx_location",
"idx_login",
"idx_name",
"idx_public_repositories_count",
"idx_title",
"idx_updated_at",
"idx_url",
)

settings = {
"attributeForDistinct": "idx_login",
"minProximity": 4,
"customRanking": [
"desc(idx_followers_count)",
"desc(idx_created_at)",
],
"ranking": [
"typo",
"words",
"filters",
"proximity",
"attribute",
"exact",
"custom",
],
"searchableAttributes": [
"unordered(idx_email, idx_login, idx_name)",
"unordered(idx_company, idx_location)",
"unordered(idx_bio)",
],
}

should_index = "is_indexable"

def get_queryset(self):
"""Get queryset for indexing."""
return User.objects.all()

@staticmethod
def update_synonyms():
"""Update synonyms."""
UserIndex.reindex_synonyms("github", "users")
80 changes: 80 additions & 0 deletions backend/apps/github/models/mixins/user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
"""GitHub user model mixins for index-related functionality."""


class UserIndexMixin:
"""User index mixin."""

@property
def idx_avatar_url(self):
"""Return avatar URL for indexing."""
return self.avatar_url

@property
def idx_bio(self):
"""Return bio for indexing."""
return self.bio

@property
def idx_company(self):
"""Return company for indexing."""
return self.company

@property
def idx_created_at(self):
"""Return created at timestamp for indexing."""
return self.created_at

@property
def idx_email(self):
"""Return email for indexing."""
return self.email

@property
def idx_key(self):
"""Return key for indexing."""
return self.login

@property
def idx_followers_count(self):
"""Return followers count for indexing."""
return self.followers_count

@property
def idx_following_count(self):
"""Return following count for indexing."""
return self.following_count

@property
def idx_location(self):
"""Return location for indexing."""
return self.location

@property
def idx_login(self):
"""Return login for indexing."""
return self.login

@property
def idx_name(self):
"""Return name for indexing."""
return self.name

@property
def idx_public_repositories_count(self):
"""Return public repositories count for indexing."""
return self.public_repositories_count

@property
def idx_title(self):
"""Return title for indexing."""
return self.title

@property
def idx_updated_at(self):
"""Return updated at timestamp for indexing."""
return self.updated_at

@property
def idx_url(self):
"""Return GitHub profile URL for indexing."""
return self.url
8 changes: 7 additions & 1 deletion backend/apps/github/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@

from apps.common.models import TimestampedModel
from apps.github.models.common import GenericUserModel, NodeModel
from apps.github.models.mixins.user import UserIndexMixin


class User(NodeModel, GenericUserModel, TimestampedModel):
class User(NodeModel, GenericUserModel, TimestampedModel, UserIndexMixin):
"""User model."""

class Meta:
Expand All @@ -21,6 +22,11 @@ def __str__(self):
"""User human readable representation."""
return f"{self.name or self.login}"

@property
def is_indexable(self):
"""Users to index."""
return self.login != "ghost" # See https://github.com/ghost for more info.

def from_github(self, gh_user):
"""Update instance based on GitHub user data."""
super().from_github(gh_user)
Expand Down

0 comments on commit e160832

Please sign in to comment.