コード例 #1
0
ファイル: admin.py プロジェクト: oblalex/django-workflow
 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)
コード例 #2
0
ファイル: admin.py プロジェクト: oblalex/django-workflow
 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))
コード例 #3
0
ファイル: admin.py プロジェクト: oblalex/django-workflow
    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(".")
コード例 #4
0
ファイル: admin.py プロジェクト: oblalex/django-workflow
 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)