Skip to main content

members app

Rich profile data attached to each Membership.

Models (8)

  • MemberProfile — extends Membership 1:1; fields: bio, hometown, major, graduation_year, photo, social_links, custom_fields (JSONField), big-little FKs
  • MemberDegree — formal degrees (BA, BS, etc.) + institutions
  • WorkHistory — past + current employers
  • Certification — professional certs
  • Affiliation — non-Greek org memberships (Honors societies, etc.)
  • MemberSkill — listed skills
  • SkillEndorsement — peer endorsements on a skill
  • Recognition — shout-outs sent + received between members

Key endpoints

URLPurpose
GET /api/members/<id>/profile/Full profile
PATCH /api/members/<id>/profile/Update editable fields
GET /api/members/search/Search by name, skill, employer
POST /api/members/<id>/skills/Add a skill
POST /api/members/<id>/endorsements/Endorse another's skill
POST /api/members/<id>/recognitions/Send a recognition
GET /api/chapters/<chapter_id>/family-tree/Big-little lineage data

Permissions

  • IsAuthenticated — own profile (full edit)
  • IsChapterMember — directory + others' profiles (read)
  • IsChapterOfficer — edit role / status / sensitive custom fields on others
  • IsNationalAdmin — across-chapter edits

Background tasks

  • sync_linkedin_profile(user_id) — pulls work history from LinkedIn (uses LinkedInAccount token from apps.authentication)
  • calculate_profile_completeness(membership_id) — recomputes the completeness score per ProfileCompletenessConfig

External integrations

  • LinkedIn (OAuth via apps.authentication.LinkedInAccount)

Notable patterns

Custom fields

MemberProfile.custom_fields is a JSONField. The keys are defined per-org via apps.organizations.OrganizationCustomField (separate model). Validation happens at write time against the org's custom-field config.

Profile completeness

Score between 0–100, calculated from required fields (org-configurable). Surfaced on the profile page and used by some health-score formulas.

Big-little family tree

MemberProfile.big_id — FK to another MemberProfile. The family tree query traverses this recursively. Frontend uses Reaflow / D3 for visualization.

Hybrid: ORM icontains for name + employer, Postgres pg_trgm for fuzzy match on hometown, major, custom field text values. Endpoint: GET /api/members/search/?q=...

Recognition feed

Recognition rows fan out into notifications.Notification rows for the recipient. Public recognitions also surface in the chapter activity feed (via apps.activity).

Code paths

  • Models: backend/apps/members/models.py
  • Views: backend/apps/members/views.py
  • Search service: backend/apps/members/services/search.py