Skip to main content

django-friendship provides an easy extensible interface for following and friendship

Project description

django-friendship

CI

This application enables you to create and manage follows, blocks and bi-directional friendships between users. It features:

  • Friendship request objects that can be accepted, rejected, canceled, or marked as viewed.
  • Hooks to easily list all friend requests sent or received by a given user, filtered by the status of the request.
  • A blocklist for each user of users they've blocked.
  • Tags to include information about friendships, blocks and follows in your templates.
  • Integration with AUTH_USER_MODEL.
  • Validation to prevent common mistakes.
  • Faster server response time through caching

Requirements

Django 4.2, 5.1, and 5.2 + Python 3.9, 3.10, 3.11, 3.12, and 3.13 support added >v1.9.6

Previously:

  • Django 3.2 since v1.9.1
  • Django 1.11+ since v1.7.0 (latest release supporting Django 1.10 is v1.6.0)

Installation

  1. pip install django-friendship
  2. add "friendship" to INSTALLED_APPS and run python manage.py migrate.
  3. Use the friendship manager in your own views, or wire up the URLconf to include the builtin views:
urlpatterns = [
    # other paths
    path("friendship/", include("friendship.urls"))
]

Note: If you are migrating from django-friendship v1.6.x, you'll need to rollback your migrations and fake migration 0002

$ ./manage.py migrate friendship 0001
$ ./manage.py migrate friendship 0002 --fake

If you're migrating from v1.7.x, you'll likely have to fake 0003 as well:

$ ./manage.py migrate friendship 0003 --fake

Usage

django-friendship provides a free API that gives you several ways to create and manage friendship requests or follows in your views. Add the following at the top of your views.py:

from django.contrib.auth.models import User
from friendship.models import Friend, Follow, Block

Getting Data about Friendships

  • List all of a user's friends: Friend.objects.friends(request.user)
  • List all unread friendship requests: Friend.objects.unread_requests(user=request.user)
  • List all unrejected friendship requests: Friend.objects.unrejected_requests(user=request.user)
  • Count of all unrejected friendship requests: Friend.objects.unrejected_request_count(user=request.user)
  • List all rejected friendship requests: Friend.objects.rejected_requests(user=request.user)
  • Count of all rejected friendship requests: Friend.objects.rejected_request_count(user=request.user)
  • List of all sent friendship requests: Friend.objects.sent_requests(user=request.user)
  • Test if two users are friends: Friend.objects.are_friends(request.user, other_user) == True

Getting Data about Follows

  • List of a user's followers: Follow.objects.followers(request.user)
  • List of who a user is following: Follow.objects.following(request.user)

Getting Data about Blocks

  • List of a user's blockers: Block.objects.blocked(request.user)
  • List of who a user is blocking: Block.objects.blocking(request.user)
  • Test if a user is blocked: Block.objects.is_blocked(request.user, other_user) == True

Managing Friendships and Follows

Create a friendship request:

other_user = User.objects.get(pk=1)
Friend.objects.add_friend(
    request.user,  # The sender
    other_user,  # The recipient
    message="Hi! I would like to add you",
)  # This message is optional

Let the user who received the request respond:

from friendship.models import FriendshipRequest

friend_request = FriendshipRequest.objects.get(
    from_user=request.user, to_user=other_user
)
friend_request.accept()
# or friend_request.reject()

To remove the friendship relationship between request.user and other_user, do the following:

Friend.objects.remove_friend(request.user, other_user)

Make request.user a follower of other_user:

Follow.objects.add_follower(request.user, other_user)

Make request.user block other_user:

Block.objects.add_block(request.user, other_user)

Make request.user unblock other_user:

Block.objects.remove_block(request.user, other_user)

Templates

You can use django-friendship tags in your templates. First enter:

{% load friendshiptags %}

Then use any of the following:

{% friends request.user %}
{% followers request.user %}
{% following request.user %}
{% friend_requests request.user %}
{% blockers request.user %}
{% blocking request.user %}

Signals

django-friendship emits the following signals:

  • friendship_request_created
  • friendship_request_rejected
  • friendship_request_canceled
  • friendship_request_accepted
  • friendship_removed
  • follower_created
  • following_created
  • follower_removed
  • following_removed
  • block_created
  • block_removed

Settings

django-friendship supports the following settings:

FRIENDSHIP_CONTEXT_OBJECT_NAME = "user"
FRIENDSHIP_CONTEXT_OBJECT_LIST_NAME = "users"
FRIENDSHIP_MANAGER_FRIENDSHIP_REQUEST_SELECT_RELATED_STRATEGY = (
    "select_related"  # ('select_related', 'prefetch_related', 'none')
)

Contributing

Development takes place on GitHub. Bug reports, patches, and fixes are always welcome!

Need help?

REVSYS can help with your Python, Django, and infrastructure projects. If you have a question about this project, please open a GitHub issue. If you love us and want to keep track of our goings-on, here's where you can find us online:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_friendship-1.10.0.tar.gz (19.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_friendship-1.10.0-py3-none-any.whl (35.2 kB view details)

Uploaded Python 3

File details

Details for the file django_friendship-1.10.0.tar.gz.

File metadata

  • Download URL: django_friendship-1.10.0.tar.gz
  • Upload date:
  • Size: 19.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for django_friendship-1.10.0.tar.gz
Algorithm Hash digest
SHA256 c63cd48f94ec3b2c3f4179ccdbf142029ca6b7f8c812e6ebaaabcdf6031e9449
MD5 cdf937c44815d72f12bc719eedb6cf09
BLAKE2b-256 66dc319406a1cfefe3d6058079dbabd4c883e30bfca311ded50bfb437f84d469

See more details on using hashes here.

File details

Details for the file django_friendship-1.10.0-py3-none-any.whl.

File metadata

  • Download URL: django_friendship-1.10.0-py3-none-any.whl
  • Upload date:
  • Size: 35.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for django_friendship-1.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3344904d84621416054e1b074a676b7a8590a402329776506c45d9a19fd0e93f
MD5 c610b813b0ea3dd07bd47b4eaf362b26
BLAKE2b-256 2196e6160257f89f8bfc98acf9f57ae54089bc14eeb9b8ffa287eb78e7c10ef6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page