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 FKsMemberDegree— formal degrees (BA, BS, etc.) + institutionsWorkHistory— past + current employersCertification— professional certsAffiliation— non-Greek org memberships (Honors societies, etc.)MemberSkill— listed skillsSkillEndorsement— peer endorsements on a skillRecognition— shout-outs sent + received between members
Key endpoints
| URL | Purpose |
|---|---|
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 othersIsNationalAdmin— across-chapter edits
Background tasks
sync_linkedin_profile(user_id)— pulls work history from LinkedIn (usesLinkedInAccounttoken fromapps.authentication)calculate_profile_completeness(membership_id)— recomputes the completeness score perProfileCompletenessConfig
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.
Search
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
Related
- organizations app — Membership owns the profile
- Custom fields (org admin)