BaseApp Comments
Project description
BaseApp Comments
Reusable app to handle comments threads.
Whats missing
- DRF views and serializers
How to install:
This package requires to following packages to be installed:
And install the package with pip install baseapp-comments
.
If you want to develop, install using this other guide.
How to setup:
1 - Make sure to have GraphQL websocket enabled in your project
2 - Add baseapp_comments
to your project's INSTALLED_APPS
and run ./manage.py migrate
as any other django model:
INSTALLED_APPS = [
# ...
"baseapp_comments",
# ...
]
3 - Add baseapp_comments.permissions.CommentsPermissionsBackend
to the AUTHENTICATION_BACKENDS
list in your django settings file.
AUTHENTICATION_BACKENDS = [
# ...
"baseapp_comments.permissions.CommentsPermissionsBackend",
# ...
]
4 - Make sure to add the task routing for the notifications:
CELERY_TASK_ROUTES = {
"baseapp_comments.notifications.send_reply_created_notification": {
"exchange": "default",
"routing_key": "default",
},
"baseapp_comments.notifications.send_comment_created_notification": {
"exchange": "default",
"routing_key": "default",
}
}
5 - Expose CommentsMutations
, CommentsQueries
and CommentsSubscriptions
in your GraphQL/graphene endpoint, like:
from baseapp_comments.graphql.mutations import CommentsMutations
from baseapp_comments.graphql.queries import CommentsQueries
from baseapp_comments.graphql.subscriptions import CommentsSubscriptions
class Query(graphene.ObjectType, CommentsQueries):
pass
class Mutation(graphene.ObjectType, CommentsMutations):
pass
class Subscription(graphene.ObjectType, CommentsSubscriptions):
pass
schema = graphene.Schema(query=Query, mutation=Mutation, subscription=Subscription)
How to use
You can customize some settings, bellow are the default values:
BASEAPP_COMMENTS_CAN_ANONYMOUS_VIEW_COMMENTS = True
BASEAPP_COMMENTS_MAX_PINS_PER_THREAD = None
BASEAPP_COMMENTS_ENABLE_GRAPHQL_SUBSCRIPTIONS = True
BASEAPP_COMMENTS_ENABLE_NOTIFICATIONS = True
You need to inherit CommentableModel
in your model and make sure to add CommentsInterface
to your ObjectType's interfaces like:
CommentableModel
from django.db import models
from baseapp_comments.models import CommentableModel
class MyModel(models.Model, CommentableModel):
pass
This will add the following fields to your model:
comments
a reverse relation toComment
modelcomments_count
a JSON field that stores the count of comments for the object like:{total: 5, main: 3, replies: 2, pinned: 1}
is_comments_enabled
a boolean fields that stores if comments are enabled for the object
Don't forget to run ./manage.py makemigrations
and ./manage.py migrate
after adding CommentableModel
to your model.
CommentsInterface
CommentsInterface
is a GraphQL interface that can be used to query for comments. It has the following fields:
isCommentsEnabled
return the activeURLPath
commentsCount
returnCommentsCount
objectType with the following fields:total
main
replies
pinned
comments
list of comments attached to this object
from baseapp_core.graphql import DjangoObjectType
from baseapp_comments.graphql import CommentsInterface
class MyModelObjectType(DjangoObjectType):
class Meta:
model = MyModel
interfaces = (relay.Node, CommentsInterface)
Signals
There are some signals that handles stuff like updating comments count, notify users when a comment is created and send a GraphQL subscription when a comment is created, updated or deleted. You can find all signals in baseapp_comments.signals
.
You could disconnect the signals and connect your own handlers if you want to customize the behavior.
import swapper
from django.db.models.signals import post_save
from baseapp_comments.signals import notify_on_comment_created
Comment = swapper.load_model("baseapp_comments", "Comment")
post_save.disconnect(notify_on_comment_created, dispatch_uid="notify_on_comment_created")
def my_custom_notify_on_comment_created(sender, instance, created, **kwargs):
# your custom code here
pass
post_save.connect(notify_on_comment_created, sender=Comment, dispatch_uid="notify_on_comment_created")
Permissions
In can inherit baseapp_comments.permissions.CommentsPermissionsBackend
to customize the permissions.
from baseapp_comments.permissions import CommentsPermissionsBackend
class MyCommentsPermissionsBackend(CommentsPermissionsBackend):
def has_perm(self, user_obj, perm, obj=None):
if perm == "baseapp_comments.add_comment_with_profile":
return obj.owner_id == user.id # only the profile's owner can use
return super().has_perm(user_obj, perm, obj)
And add it to your AUTHENTICATION_BACKENDS
list in your django settings file.
AUTHENTICATION_BACKENDS = [
# ...
"myapp.permissions.MyCommentsPermissionsBackend",
# ...
]
How to develop
General development instructions can be found in main README.
Breaking Changes
[0.3.0] - 2024-10-23
- Removed pghistory tracking from the
Comment
model:
@pghistory.track(
pghistory.InsertEvent(),
pghistory.UpdateEvent(),
pghistory.DeleteEvent(),
exclude=["comments_count", "reactions_count"],
)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file baseapp_comments-0.3.0.tar.gz
.
File metadata
- Download URL: baseapp_comments-0.3.0.tar.gz
- Upload date:
- Size: 28.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | fd43276f80d8ad621f91070874b14af5bf2e52b510b475b4e76cbdfcd4a4d9a7 |
|
MD5 | c14133ef132452ff9dc0c7e27fd1d0e5 |
|
BLAKE2b-256 | 89faeeb41df710cdfefec5d96a6a832204971343050c8b9c39681e1503f00cd7 |