44from django .conf import settings
55from django .contrib import messages
66from django .contrib .auth .decorators import login_required
7+ from django .contrib .contenttypes .models import ContentType
78from django .db .models import F
89from django .http import Http404 , HttpResponse , HttpResponseRedirect
910from django .shortcuts import get_object_or_404 , redirect , render
2627from moderation .models import ModerationLog
2728
2829
30+ def _document_form_for_user (user , document , * args , ** kwargs ):
31+ form = DocumentForm (* args , instance = document , ** kwargs )
32+ if not user .moderation_perm (document ):
33+ form .fields .pop ("staff_pick" , None )
34+ return form
35+
36+
2937@login_required
3038@slug_redirect
3139def upload_file (request , slug ):
@@ -128,21 +136,38 @@ def document_edit(request, pk):
128136 old_name = doc .name
129137 old_description = doc .description
130138 old_tags = list (doc .tags .all ())
139+ old_staff_pick = doc .staff_pick
131140
132- form = DocumentForm (request .POST , instance = doc )
141+ can_staff_pick = request .user .moderation_perm (doc )
142+ form = _document_form_for_user (request .user , doc , request .POST )
133143
134144 if form .is_valid ():
135145 if request .user != doc .user :
146+ values = {
147+ "name" : (old_name , form .cleaned_data ["name" ]),
148+ "description" : (
149+ old_description ,
150+ form .cleaned_data ["description" ],
151+ ),
152+ "tags" : (old_tags , form .cleaned_data ["tags" ]),
153+ }
154+ if can_staff_pick :
155+ values ["staff_pick" ] = (
156+ old_staff_pick ,
157+ form .cleaned_data ["staff_pick" ],
158+ )
159+ ModerationLog .track (
160+ user = request .user , content_object = doc , values = values
161+ )
162+ elif can_staff_pick :
136163 ModerationLog .track (
137164 user = request .user ,
138165 content_object = doc ,
139166 values = {
140- "name" : (old_name , form .cleaned_data ["name" ]),
141- "description" : (
142- old_description ,
143- form .cleaned_data ["description" ],
167+ "staff_pick" : (
168+ old_staff_pick ,
169+ form .cleaned_data ["staff_pick" ],
144170 ),
145- "tags" : (old_tags , form .cleaned_data ["tags" ]),
146171 },
147172 )
148173
@@ -155,7 +180,7 @@ def document_edit(request, pk):
155180 return HttpResponseRedirect (reverse ("document_show" , args = [doc .id ]))
156181
157182 else :
158- form = DocumentForm ( instance = doc )
183+ form = _document_form_for_user ( request . user , doc )
159184
160185 return render (
161186 request ,
@@ -234,6 +259,10 @@ def document_show(request, pk):
234259 "document" : document ,
235260 "user_vote" : document .vote_set .filter (user = request .user ).first (),
236261 "form" : DocumentReportForm (),
262+ "has_moderation_history" : ModerationLog .objects .filter (
263+ content_type = ContentType .objects .get_for_model (Document ),
264+ object_id = document .pk ,
265+ ).exists (),
237266 }
238267
239268 return render (request , "documents/viewer.html" , context )
0 commit comments