Source code for friends.views

"""
Views
=====

.. _class-based-views:

Class Based Views
-----------------

All the views are implemented as
`classes <https://docs.djangoproject.com/en/dev/topics/class-based-views/>`_
but :ref:`view functions <view-functions>` are also provided.

.. autoclass:: BaseFriendshipActionView

.. autoclass:: FriendshipAcceptView

.. autoclass:: FriendshipBlockView

.. autoclass:: FriendshipCancelView

.. autoclass:: FriendshipDeclineView

.. autoclass:: FriendshipDeleteView

.. autoclass:: FriendshipRequestView

.. autoclass:: FriendshipUnblockView


.. _view-functions:

View Functions
--------------

.. tip:: If you want to customize the views provided, check out :ref:`class-based-views` first.

.. autofunction:: friendship_request

.. autofunction:: friendship_accept

.. autofunction:: friendship_decline

.. autofunction:: friendship_cancel

.. autofunction:: friendship_delete

.. autofunction:: user_block

.. autofunction:: user_unblock
"""

from django.http import HttpResponseBadRequest, Http404
from django.db import transaction
from django.views.generic.base import RedirectView
from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from models import FriendshipRequest, Friendship
from app_settings import REDIRECT_FALLBACK_TO_PROFILE


[docs]class BaseFriendshipActionView(RedirectView): http_method_names = ['get', 'post'] permanent = False def set_url(self, request, **kwargs): if 'redirect_to' in kwargs: self.url = kwargs['redirect_to'] elif 'redirect_to_param' in kwargs and \ kwargs['redirect_to_param'] in request.REQUEST: self.url = request.REQUEST[kwargs['redirect_to_param']] elif 'redirect_to' in request.REQUEST: self.url = request.REQUEST['next'] elif REDIRECT_FALLBACK_TO_PROFILE: self.url = request.user.get_profile().get_absolute_url() else: self.url = request.META.get('HTTP_REFERER', '/') def get(self, request, username, *args, **kwargs): if request.user.username == username: return HttpResponseBadRequest(ugettext(u'You can\'t befriend ' \ u'yourself.')) user = get_object_or_404(User, username=username) self.action(request, user, *args, **kwargs) self.set_url(request, **kwargs) return super(BaseFriendshipActionView, self).get(request, **kwargs)
[docs]class FriendshipAcceptView(BaseFriendshipActionView): @transaction.commit_on_success def accept_friendship(self, from_user, to_user): get_object_or_404(FriendshipRequest, from_user=from_user, to_user=to_user).accept() def action(self, request, user, **kwargs): self.accept_friendship(user, request.user)
[docs]class FriendshipRequestView(FriendshipAcceptView): @transaction.commit_on_success def action(self, request, user, **kwargs): if Friendship.objects.are_friends(request.user, user): raise RuntimeError('%r amd %r are already friends' % \ (request.user, user)) try: # If there's a friendship request from the other user accept it. self.accept_friendship(user, request.user) except Http404: request_message = request.REQUEST.get('message', u'') # If we already have an active friendship request IntegrityError # will be raised and the transaction will be rolled back. FriendshipRequest.objects.create(from_user=request.user, to_user=user, message=request_message)
[docs]class FriendshipDeclineView(BaseFriendshipActionView): def action(self, request, user, **kwargs): get_object_or_404(FriendshipRequest, from_user=user, to_user=request.user).decline()
[docs]class FriendshipCancelView(BaseFriendshipActionView): def action(self, request, user, **kwargs): get_object_or_404(FriendshipRequest, from_user=request.user, to_user=user).cancel()
[docs]class FriendshipDeleteView(BaseFriendshipActionView): def action(self, request, user, **kwargs): Friendship.objects.unfriend(request.user, user)
[docs]class FriendshipBlockView(BaseFriendshipActionView): def action(self, request, user, **kwargs): request.user.user_blocks.blocks.add(user)
[docs]class FriendshipUnblockView(BaseFriendshipActionView): def action(self, request, user, **kwargs): request.user.user_blocks.blocks.remove(user)
friendship_request = login_required(FriendshipRequestView.as_view()) friendship_accept = login_required(FriendshipAcceptView.as_view()) friendship_decline = login_required(FriendshipDeclineView.as_view()) friendship_cancel = login_required(FriendshipCancelView.as_view()) friendship_delete = login_required(FriendshipDeleteView.as_view()) user_block = login_required(FriendshipBlockView.as_view()) user_unblock = login_required(FriendshipUnblockView.as_view())

Project Versions

This Page