from django.contrib import messages
from django.contrib.auth.models import User
from django.core.exceptions import SuspiciousOperation
from django.shortcuts import render
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.utils.translation import gettext as _
from django.views.generic import TemplateView
from oioioi.base.menu import account_menu_registry
from oioioi.base.permissions import enforce_condition, not_anonymous
from oioioi.base.utils.user_selection import get_user_hints_view
from oioioi.problemsharing.forms import AddFriendshipForm
from oioioi.problemsharing.models import Friendship
from oioioi.teachers.views import is_teacher
account_menu_registry.register(
name='friends',
text=_("Friends"),
url_generator=lambda request: reverse('problemsharing_friends'),
condition=is_teacher,
order=170,
)
@method_decorator(enforce_condition(not_anonymous & is_teacher), name='dispatch')
[docs]class FriendshipsView(TemplateView):
[docs] template_name = 'problemsharing/friendship.html'
[docs] def get_context_data(self, **kwargs):
ctx = super(FriendshipsView, self).get_context_data(**kwargs)
ctx['form'] = AddFriendshipForm()
ctx['friends'] = User.objects.filter(
friendships_received__creator=self.request.user
)
return ctx
[docs] def post(self, request):
ctx = self.get_context_data()
if 'befriend' in request.POST:
# if we would always pass POST data to AddFriendshipForm,
# an "field empty" error message would appear on "unfriending"
ctx['form'] = AddFriendshipForm(self.request.POST)
if ctx['form'].is_valid():
receiver = ctx['form'].cleaned_data['user']
if Friendship.objects.filter(
creator=request.user, receiver=receiver
).exists():
messages.warning(request, _("This user is already your friend"))
return render(request, self.template_name, ctx)
if receiver == request.user:
messages.error(request, _("You can't befriend yourself"))
return render(request, self.template_name, ctx)
friendship = Friendship(creator=request.user, receiver=receiver)
friendship.save()
ctx['form'] = AddFriendshipForm() # Clean form input
messages.info(request, _("Friend added"))
elif 'unfriend' in request.POST:
try:
friendship = Friendship.objects.get(
creator=request.user, receiver_id=request.POST.get('id')
)
friendship.delete()
ctx['friends'].exclude(id=request.POST.get('id'))
except Friendship.DoesNotExist:
messages.error(
request, _("Invalid request (this user is not your friend)")
)
else:
raise SuspiciousOperation
return render(request, self.template_name, ctx)
@enforce_condition(is_teacher)
[docs]def friend_hints_view(request):
queryset = (
User.objects.filter(teacher__isnull=False)
.exclude(friendships_received__creator=request.user)
.exclude(id=request.user.id)
)
return get_user_hints_view(request, 'substr', queryset)