|
5 | 5 | from __future__ import absolute_import, print_function, unicode_literals |
6 | 6 |
|
7 | 7 | import io |
| 8 | +import json |
8 | 9 | import os |
9 | 10 | import datetime |
10 | 11 | import requests |
11 | 12 | import email.utils |
12 | 13 |
|
| 14 | +from django.utils.http import is_safe_url |
| 15 | + |
13 | 16 | import debug # pyflakes:ignore |
14 | 17 |
|
15 | | -from django.http import HttpResponseForbidden, JsonResponse |
| 18 | +from django.http import HttpResponseForbidden, JsonResponse, HttpResponse, HttpResponseRedirect |
16 | 19 | from django.shortcuts import render, get_object_or_404, redirect |
17 | 20 | from django import forms |
18 | 21 | from django.conf import settings |
|
27 | 30 | from ietf.name.models import ReviewRequestStateName, ReviewAssignmentStateName, ReviewResultName, \ |
28 | 31 | DocTypeName, ReviewTypeName |
29 | 32 | from ietf.person.models import Person |
30 | | -from ietf.review.models import ReviewRequest, ReviewAssignment |
| 33 | +from ietf.review.models import ReviewRequest, ReviewAssignment, ReviewWish |
31 | 34 | from ietf.group.models import Group |
32 | 35 | from ietf.ietfauth.utils import is_authorized_in_doc_stream, user_is_person, has_role |
33 | 36 | from ietf.message.models import Message |
@@ -967,3 +970,64 @@ def edit_deadline(request, name, request_id): |
967 | 970 | 'review_req': review_req, |
968 | 971 | 'form' : form, |
969 | 972 | }) |
| 973 | + |
| 974 | + |
| 975 | +class ReviewWishAddForm(forms.Form): |
| 976 | + team = forms.ModelChoiceField(queryset=Group.objects.filter(reviewteamsettings__isnull=False), |
| 977 | + widget=forms.RadioSelect, empty_label=None, required=True) |
| 978 | + |
| 979 | + def __init__(self, user, doc, *args, **kwargs): |
| 980 | + super(ReviewWishAddForm, self).__init__(*args, **kwargs) |
| 981 | + self.person = get_object_or_404(Person, user=user) |
| 982 | + self.doc = doc |
| 983 | + self.fields['team'].queryset = self.fields['team'].queryset.filter(role__person=self.person, |
| 984 | + role__name='reviewer') |
| 985 | + if len(self.fields['team'].queryset) == 1: |
| 986 | + self.team = self.fields['team'].queryset.get() |
| 987 | + del self.fields['team'] |
| 988 | + |
| 989 | + def save(self): |
| 990 | + team = self.team if hasattr(self, 'team') else self.cleaned_data['team'] |
| 991 | + ReviewWish.objects.get_or_create(person=self.person, team=team, doc=self.doc) |
| 992 | + |
| 993 | +@login_required |
| 994 | +def review_wish_add(request, name): |
| 995 | + doc = get_object_or_404(Document, docalias__name=name) |
| 996 | + |
| 997 | + if request.method == "POST": |
| 998 | + form = ReviewWishAddForm(request.user, doc, request.POST) |
| 999 | + if form.is_valid(): |
| 1000 | + form.save() |
| 1001 | + return _generate_ajax_or_redirect_response(request, doc) |
| 1002 | + else: |
| 1003 | + form = ReviewWishAddForm(request.user, doc) |
| 1004 | + |
| 1005 | + return render(request, "doc/review/review_wish_add.html", { |
| 1006 | + "doc": doc, |
| 1007 | + "form": form, |
| 1008 | + }) |
| 1009 | + |
| 1010 | +@login_required |
| 1011 | +def review_wishes_remove(request, name): |
| 1012 | + doc = get_object_or_404(Document, docalias__name=name) |
| 1013 | + person = get_object_or_404(Person, user=request.user) |
| 1014 | + |
| 1015 | + if request.method == "POST": |
| 1016 | + ReviewWish.objects.filter(person=person, doc=doc).delete() |
| 1017 | + return _generate_ajax_or_redirect_response(request, doc) |
| 1018 | + |
| 1019 | + return render(request, "doc/review/review_wishes_remove.html", { |
| 1020 | + "name": doc.name, |
| 1021 | + }) |
| 1022 | + |
| 1023 | + |
| 1024 | +def _generate_ajax_or_redirect_response(request, doc): |
| 1025 | + redirect_url = request.GET.get('next') |
| 1026 | + url_is_safe = is_safe_url(url=redirect_url, allowed_hosts=request.get_host(), |
| 1027 | + require_https=request.is_secure()) |
| 1028 | + if request.is_ajax(): |
| 1029 | + return HttpResponse(json.dumps({'success': True}), content_type='application/json') |
| 1030 | + elif url_is_safe: |
| 1031 | + return HttpResponseRedirect(redirect_url) |
| 1032 | + else: |
| 1033 | + return HttpResponseRedirect(doc.get_absolute_url()) |
0 commit comments