def history_view(self, request, object_id, extra_context=None): object_id = unquote(object_id) opts = self.model._meta latest_approved_id = Version.objects.latest_approved(self.content_type, object_id).id action_list = [ { 'revision': version.revision, 'edit_url': version_edit_url(version.object_id, version.id, self.admin_site.name, opts), 'view_url': version_view_changes_url(version.object_id, version.id, self.admin_site.name, opts), 'approve_url': version_approve_url(version.object_id, version.id, self.admin_site.name, opts), 'reject_url': version_reject_url(version.object_id, version.id, self.admin_site.name, opts), 'recover_url': reverse('%s:%s_%s_recover' % ( self.admin_site.name, opts.app_label, opts.module_name ), args=[version.id]), 'is_current': version.id == latest_approved_id, 'children_pks': version.revision.children.all().values_list('id', flat=True), 'pending': version.revision.status == VERSION_STATUS_NEED_ATTENTION, } for version in Version.objects.filter( object_id=object_id, content_type=self.content_type ).select_related('revision', 'revision__changed_by', 'revision__moderated_by') ] context = { 'action_list': action_list , 'is_admin': is_user_content_admin(request.user) } context.update(extra_context or {}) return super(WorkflowAdmin, self).history_view(request, object_id, context)
def recoverlist_view(self, request, extra_context=None): """Displays a list of deleted models to allow recovery.""" # check if user has change or add permissions for model if not is_user_content_admin(request.user): raise PermissionDenied model = self.model opts = model._meta deleted = Version.objects.get_deleted(self.content_type) context = { 'opts': opts, 'app_label': opts.app_label, 'module_name': capfirst(opts.verbose_name), 'title': _("Deleted %(name)s") % {'name': force_text(opts.verbose_name_plural)}, 'deleted': deleted, 'changelist_url': reverse("%s:%s_%s_changelist" % ( self.admin_site.name, opts.app_label, opts.module_name)), } extra_context = extra_context or {} context.update(extra_context) return render_to_response( self.recoverlist_template, context, template.RequestContext(request))
def process_common_post(self, request, obj, moderator, revision, form, formsets): latest_approved_revision = Version.objects.latest_approved(self.content_type, obj.pk).revision comment = request.POST.get("moderator_new_comment", "") changes = False if formsets: for formset in formsets: changes = (hasattr(formset, 'new_objects') or hasattr(formset, 'changed_objects') or hasattr(formset, 'deleted_objects')) if changes: break changes = changes or form.has_changed() status_changed = False if request.POST.has_key("_reject"): status_changed = True revision.status = VERSION_STATUS_REJECTED if comment: revision.comment = comment if request.POST.has_key("_approve"): status_changed = True if changes: if revision.status == VERSION_STATUS_NEED_ATTENTION: # TODO: can be branged? revision.status = VERSION_STATUS_DRAFT revision.update_moderation(moderator) revision.save() self.save_with_relations(request, obj, form, formsets) revision = self.revision_manager.save_revision( self.get_revision_data(request, obj, VERSION_TYPE_CHANGE), parent = revision, user = moderator, comment = comment, status = VERSION_STATUS_APPROVED, ignore_duplicates = self.ignore_duplicate_revisions, db = self.revision_context_manager.get_db(),) else: revision.status = VERSION_STATUS_APPROVED revision.revert(latest_approved_revision) if status_changed: revision.update_moderation(moderator) revision.save() return HttpResponseRedirect( version_history_url(obj.id, self.admin_site.name, self.model._meta)) if request.POST.has_key('_recover'): self.save_with_relations(request, obj, form, formsets) revision = self.revision_manager.save_revision( self.get_revision_data(request, obj, VERSION_TYPE_RECOVER), parent = revision, user = moderator, comment = _(u"Deleted object was recovered."), status = VERSION_STATUS_APPROVED, ignore_duplicates = self.ignore_duplicate_revisions, db = self.revision_context_manager.get_db(), ) return HttpResponseRedirect( version_edit_url( obj.id, revision.version(obj.id, self.content_type).pk, self.admin_site.name, self.model._meta)) if request.POST.has_key('_toapprove'): if changes or revision.status == VERSION_STATUS_REJECTED: self.save_with_relations(request, obj, form, formsets) revision_parent = revision revision = self.revision_manager.save_revision( self.get_revision_data(request, obj, VERSION_TYPE_CHANGE), user = request.user, comment = comment, parent = revision_parent, ignore_duplicates = self.ignore_duplicate_revisions, db = self.revision_context_manager.get_db(), ) if (revision_parent.status == VERSION_STATUS_NEED_ATTENTION): revision_parent.status = VERSION_STATUS_DRAFT revision_parent.save() latest_approved_revision.revert(revision) if revision.status != VERSION_STATUS_APPROVED: revision.status = VERSION_STATUS_NEED_ATTENTION revision.save() return HttpResponseRedirect( version_edit_url(obj.id, revision.version(obj.id, self.content_type).pk, self.admin_site.name, self.model._meta)) if request.POST.has_key('_tohistory'): if changes: self.save_with_relations(request, obj, form, formsets) revision = self.revision_manager.save_revision( self.get_revision_data(request, obj, VERSION_TYPE_CHANGE), user = request.user, comment = comment, parent = revision, ignore_duplicates = self.ignore_duplicate_revisions, db = self.revision_context_manager.get_db(), ) latest_approved_revision.revert(revision) return HttpResponseRedirect( version_edit_url( obj.id, revision.version(obj.id, self.content_type).pk, self.admin_site.name, self.model._meta)) else: return HttpResponseRedirect(".") if any(i in request.POST.keys() for i in ["_addanother", "_continue", "_save"]): auto_approve = is_user_content_admin(moderator) # TODO: improve changes detection for inlines and save only if changes were done self.save_with_relations(request, obj, form, formsets) if changes: # self.save_with_relations(request, obj, form, formsets) revision = self.revision_manager.save_revision( self.get_revision_data(request, obj, VERSION_TYPE_CHANGE), user = request.user, comment = comment, parent = revision, status = VERSION_STATUS_APPROVED if auto_approve else VERSION_STATUS_DRAFT, ignore_duplicates = self.ignore_duplicate_revisions, db = self.revision_context_manager.get_db(), ) if not auto_approve: latest_approved_revision.revert(revision) return HttpResponseRedirect(reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.module_name), args=(obj.id,), current_app=self.admin_site.name)) elif auto_approve: # TODO: improve changes detection for inlines and use this instead of current elif statement: # elif auto_approve and (revision.children.exists() or revision.status == VERSION_STATUS_REJECTED): revision = self.revision_manager.save_revision( self.get_revision_data(request, obj, VERSION_TYPE_CHANGE), user = request.user, comment = comment, parent = revision, status = VERSION_STATUS_APPROVED, ignore_duplicates = self.ignore_duplicate_revisions, db = self.revision_context_manager.get_db(), ) return HttpResponseRedirect(reverse('admin:%s_%s_change' % ( obj._meta.app_label, obj._meta.module_name), args=(obj.id,), current_app=self.admin_site.name)) return HttpResponseRedirect(".")
def put_content_permissions(self, request, context): current_user = request.user context['has_content_manager_permission'] = is_user_content_manager(current_user) context['has_content_admin_permission'] = is_user_content_admin(current_user)