|
23 | 23 | from ietf.idrfc.mails import * |
24 | 24 | from ietf.idrfc.utils import * |
25 | 25 | from ietf.idrfc.lastcall import request_last_call |
| 26 | +from ietf.utils.textupload import get_cleaned_text_file_content |
| 27 | +from ietf.person.forms import EmailsField |
| 28 | + |
26 | 29 |
|
27 | 30 | from ietf.ietfworkflows.models import Stream |
28 | 31 | from ietf.ietfworkflows.utils import update_stream |
@@ -866,6 +869,122 @@ def edit_iesg_note(request, name): |
866 | 869 | ), |
867 | 870 | context_instance=RequestContext(request)) |
868 | 871 |
|
| 872 | +class ShepherdWriteupUploadForm(forms.Form): |
| 873 | + content = forms.CharField(widget=forms.Textarea, label="Shepherd writeup", help_text="Edit the shepherd writeup", required=False) |
| 874 | + txt = forms.FileField(label=".txt format", help_text="Or upload a .txt file", required=False) |
| 875 | + |
| 876 | + def clean_content(self): |
| 877 | + return self.cleaned_data["content"].replace("\r", "") |
| 878 | + |
| 879 | + def clean_txt(self): |
| 880 | + return get_cleaned_text_file_content(self.cleaned_data["txt"]) |
| 881 | + |
| 882 | +def edit_shepherd_writeup(request, name): |
| 883 | + """Change this document's shepherd writeup""" |
| 884 | + doc = get_object_or_404(Document, type="draft", name=name) |
| 885 | + |
| 886 | + if not can_edit_shepherd_writeup(doc, request.user): |
| 887 | + return HttpResponseForbidden("You do not have the necessary permissions to view this page") |
| 888 | + |
| 889 | + login = request.user.get_profile() |
| 890 | + |
| 891 | + if request.method == 'POST': |
| 892 | + if "submit_response" in request.POST: |
| 893 | + form = ShepherdWriteupUploadForm(request.POST, request.FILES) |
| 894 | + if form.is_valid(): |
| 895 | + |
| 896 | + from_file = form.cleaned_data['txt'] |
| 897 | + if from_file: |
| 898 | + writeup = from_file |
| 899 | + else: |
| 900 | + writeup = form.cleaned_data['content'] |
| 901 | + |
| 902 | + e = WriteupDocEvent(doc=doc, by=login, type="changed_protocol_writeup") |
| 903 | + e.desc = "Changed document writeup" |
| 904 | + e.text = writeup |
| 905 | + e.save() |
| 906 | + |
| 907 | + return HttpResponseRedirect(urlreverse('doc_view', kwargs={'name': doc.name})) |
| 908 | + |
| 909 | + elif "reset_text" in request.POST: |
| 910 | + |
| 911 | + init = { "content": render_to_string("doc/shepherd_writeup.txt",dict(doc=doc))} |
| 912 | + form = ShepherdWriteupUploadForm(initial=init) |
| 913 | + |
| 914 | + # Protect against handcrufted malicious posts |
| 915 | + else: |
| 916 | + form = None |
| 917 | + |
| 918 | + else: |
| 919 | + form = None |
| 920 | + |
| 921 | + if not form: |
| 922 | + init = { "content": ""} |
| 923 | + |
| 924 | + previous_writeup = doc.latest_event(WriteupDocEvent,type="changed_protocol_writeup") |
| 925 | + if previous_writeup: |
| 926 | + init["content"] = previous_writeup.text |
| 927 | + else: |
| 928 | + init["content"] = render_to_string("doc/shepherd_writeup.txt", |
| 929 | + dict(doc=doc), |
| 930 | + ) |
| 931 | + form = ShepherdWriteupUploadForm(initial=init) |
| 932 | + |
| 933 | + return render_to_response('idrfc/change_shepherd_writeup.html', |
| 934 | + {'form': form, |
| 935 | + 'doc' : doc, |
| 936 | + }, |
| 937 | + context_instance=RequestContext(request)) |
| 938 | + |
| 939 | +class ShepherdForm(forms.Form): |
| 940 | + shepherd = EmailsField(label="Shepherd", required=False) |
| 941 | + |
| 942 | + def clean_shepherd(self): |
| 943 | + data = self.cleaned_data['shepherd'] |
| 944 | + if len(data)>1: |
| 945 | + raise forms.ValidationError("Please choose at most one shepherd.") |
| 946 | + return data |
| 947 | + |
| 948 | +def edit_shepherd(request, name): |
| 949 | + """Change the shepherd for a Document""" |
| 950 | + # TODO - this shouldn't be type="draft" specific |
| 951 | + doc = get_object_or_404(Document, type="draft", name=name) |
| 952 | + |
| 953 | + if not can_edit_shepherd(doc, request.user): |
| 954 | + return HttpResponseForbidden("You do not have the necessary permissions to view this page") |
| 955 | + |
| 956 | + if request.method == 'POST': |
| 957 | + form = ShepherdForm(request.POST) |
| 958 | + if form.is_valid(): |
| 959 | + |
| 960 | + if form.cleaned_data['shepherd']: |
| 961 | + doc.shepherd = form.cleaned_data['shepherd'][0].person |
| 962 | + else: |
| 963 | + doc.shepherd = None |
| 964 | + doc.save() |
| 965 | + |
| 966 | + login = request.user.get_profile() |
| 967 | + c = DocEvent(type="added_comment", doc=doc, by=login) |
| 968 | + c.desc = "Document shepherd changed to "+doc.shepherd.name |
| 969 | + c.save() |
| 970 | + |
| 971 | + return HttpResponseRedirect(urlreverse('doc_view', kwargs={'name': doc.name})) |
| 972 | + |
| 973 | + else: |
| 974 | + current_shepherd = None |
| 975 | + if doc.shepherd: |
| 976 | + e = doc.shepherd.email_set.order_by("-active", "-time") |
| 977 | + if e: |
| 978 | + current_shepherd=e[0].pk |
| 979 | + init = { "shepherd": current_shepherd} |
| 980 | + form = ShepherdForm(initial=init) |
| 981 | + |
| 982 | + return render_to_response('idrfc/change_shepherd.html', |
| 983 | + {'form': form, |
| 984 | + 'doc': doc, |
| 985 | + }, |
| 986 | + context_instance = RequestContext(request)) |
| 987 | + |
869 | 988 | class AdForm(forms.Form): |
870 | 989 | ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active").order_by('name'), |
871 | 990 | label="Shepherding AD", empty_label="(None)", required=True) |
|
0 commit comments