<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1076,7 +1076,7 @@ class PageAdmin(model_admin):
     add_plugin = create_on_success(add_plugin)
     
     def edit_plugin(self, request, plugin_id):
-         plugin_id = int(plugin_id)
+        plugin_id = int(plugin_id)
         if not 'history' in request.path and not 'recover' in request.path:
             cms_plugin = get_object_or_404(CMSPlugin, pk=plugin_id)
             instance, plugin_admin = cms_plugin.get_plugin_instance(plugin_admin_site)</diff>
      <filename>cms/admin/pageadmin.py</filename>
    </modified>
    <modified>
      <diff>@@ -4,8 +4,7 @@ from cms.admin.forms import PageAddForm
 from cms.admin.permissionadmin import PAGE_ADMIN_INLINES, \
     PagePermissionInlineAdmin
 from cms.admin.utils import get_placeholders
-from cms.admin.views import change_status, change_innavigation, add_plugin, \
-    edit_plugin, remove_plugin, move_plugin, revert_plugins, change_moderation
+from cms.admin.views import revert_plugins, save_all_plugins
 from cms.admin.widgets import PluginEditor
 from cms.exceptions import NoPermissionsException
 from cms.models import Page, Title, CMSPlugin, PagePermission, \
@@ -43,6 +42,14 @@ from django.contrib.contenttypes.models import ContentType
 
 from cms.admin.translationadmin import TranslationAdmin
 
+page_ctype = ContentType.objects.get_for_model(Page)
+
+create_on_success = lambda x: x
+    
+if 'reversion' in settings.INSTALLED_APPS:
+    import reversion
+    create_on_success = reversion.revision.create_on_success
+
 class PluginAdmin(TranslationAdmin):
 
     mandatory_placeholders = ('title', 'slug', 'language') 
@@ -110,14 +117,14 @@ class PluginAdmin(TranslationAdmin):
         if url is None:
             return self.list_pages(request)
         elif url.endswith('add-plugin'):
-            return add_plugin(request)
+            return self.add_plugin(request)
         elif 'edit-plugin' in url:
             plugin_id = url.split(&quot;/&quot;)[-1]
-            return edit_plugin(request, plugin_id, self.admin_site)
+            return self.edit_plugin(request, plugin_id, self.admin_site)
         elif 'remove-plugin' in url:
-            return remove_plugin(request)
+            return self.remove_plugin(request)
         elif 'move-plugin' in url:
-            return move_plugin(request)
+            return self.move_plugin(request)
         if url.endswith('jsi18n') or url.endswith('jsi18n/'):
             return HttpResponseRedirect(reverse('admin:jsi18n'))
         if len(url.split(&quot;/?&quot;)):
@@ -134,21 +141,17 @@ class PluginAdmin(TranslationAdmin):
         pat = lambda regex, fn: url(regex, self.admin_site.admin_view(fn), name='%s_%s' % (info, fn.__name__))
         
         url_patterns = patterns('',
-            
-            pat(r'^.+/add-plugin/$', add_plugin),
-            url(r'^.+/edit-plugin/([0-9]+)/$',
-                self.admin_site.admin_view(curry(edit_plugin, admin_site=self.admin_site)),
-                name='%s_edit_plugin' % info),
-            pat(r'^(?:[0-9]+)/remove-plugin/$', remove_plugin),
-            pat(r'^(?:[0-9]+)/move-plugin/$', move_plugin),
+            pat(r'^.+/add-plugin/$', self.add_plugin),
+            pat(r'^.+/edit-plugin/([0-9]+)/$', self.edit_plugin),
+            pat(r'^(?:[0-9]+)/remove-plugin/$', self.remove_plugin),
+            pat(r'^(?:[0-9]+)/move-plugin/$', self.move_plugin),
         )
         
         url_patterns.extend(super(PluginAdmin, self).get_urls())
         return url_patterns
     
     def redirect_jsi18n(self, request):
-            return HttpResponseRedirect(reverse('admin:jsi18n'))
-
+        return HttpResponseRedirect(reverse('admin:jsi18n'))
 
     def get_fieldsets(self, request, obj=None):
         &quot;&quot;&quot;
@@ -248,3 +251,224 @@ class PluginAdmin(TranslationAdmin):
             revert_plugins(request, version.pk, obj)
         return response
 
+    def add_plugin(self, request):
+        if 'history' in request.path or 'recover' in request.path:
+            return HttpResponse(str(&quot;error&quot;))
+        if request.method == &quot;POST&quot;:
+            plugin_type = request.POST['plugin_type']
+            app, model = request.POST.get('app'), request.POST.get('model')
+            object_id = request.POST.get('object_id', None)
+            parent = None
+            ctype = ContentType.objects.get(app_label=app, model=model)
+            if object_id:
+                content_object = ctype.get_object_for_this_type(pk=object_id)
+                placeholder = request.POST['placeholder'].lower()
+                language = request.POST['language']
+    
+                position = CMSPlugin.objects.filter(content_type=ctype, object_id=object_id, language=language, placeholder=placeholder).count()
+                if ctype.model_class() == Page:
+                    limits = settings.CMS_PLACEHOLDER_CONF.get(&quot;%s %s&quot; % (content_object.template, placeholder), {}).get('limits', None)
+                    if not limits:
+                        limits = settings.CMS_PLACEHOLDER_CONF.get(placeholder, {}).get('limits', None)
+                    if limits:
+                        global_limit = limits.get(&quot;global&quot;)
+                        type_limit = limits.get(plugin_type)
+                        if global_limit and position &gt;= global_limit:
+                            return HttpResponseBadRequest(&quot;This placeholder already has the maximum number of plugins&quot;)
+                        elif type_limit:
+                            type_count = CMSPlugin.objects.filter(content_type=ctype, object_id=object_id, language=language, placeholder=placeholder, plugin_type=plugin_type).count()
+                            if type_count &gt;= type_limit:
+                                return HttpResponseBadRequest(&quot;This placeholder already has the maximum number allowed %s plugins.'%s'&quot; % plugin_type)
+            else:
+                parent_id = request.POST['parent_id']
+                parent = get_object_or_404(CMSPlugin, pk=parent_id)
+                placeholder = parent.placeholder
+                content_object = parent.content_object
+                object_id = content_object.pk
+                language = parent.language
+                position = None
+    
+            if hasattr(content_object, 'has_change_permission') and not content_object.has_change_permission(request):
+                return HttpResponseForbidden(_(&quot;You do not have permission to change this page&quot;))
+    
+            # Sanity check to make sure we're not getting bogus values from JavaScript:
+            if not language or not language in [ l[0] for l in settings.LANGUAGES ]:
+                return HttpResponseBadRequest(_(&quot;Language must be set to a supported language!&quot;))
+            
+            plugin = CMSPlugin(content_type=ctype, object_id=object_id, language=language, plugin_type=plugin_type, position=position, placeholder=placeholder) 
+    
+            if parent:
+                plugin.parent = parent
+            plugin.save()
+            if 'reversion' in settings.INSTALLED_APPS:
+                content_object.save()
+                save_all_plugins(request, content_object)
+                revision.user = request.user
+                plugin_name = unicode(plugin_pool.get_plugin(plugin_type).name)
+                revision.comment = _(u&quot;%(plugin_name)s plugin added to %(placeholder)s&quot;) % {'plugin_name':plugin_name, 'placeholder':placeholder}
+            return HttpResponse(str(plugin.pk))
+        raise Http404
+
+    add_plugin = create_on_success(add_plugin)
+    
+    def edit_plugin(self, request, plugin_id):
+        plugin_id = int(plugin_id)
+        if not 'history' in request.path and not 'recover' in request.path:
+            cms_plugin = get_object_or_404(CMSPlugin, pk=plugin_id)
+            instance, plugin_admin = cms_plugin.get_plugin_instance(plugin_admin_site)
+            content_object = cms_plugin.content_object
+            if hasattr(content_object, 'has_change_permission') and not content_object.has_change_permission(request):
+                raise PermissionDenied 
+        else:
+            # history view with reversion
+            from reversion.models import Version
+            version_id = request.path.split(&quot;/edit-plugin/&quot;)[0].split(&quot;/&quot;)[-1]
+            Version.objects.get(pk=version_id)
+            version = get_object_or_404(Version, pk=version_id)
+            revs = [related_version.object_version for related_version in version.revision.version_set.all()]
+            # TODO: check permissions
+            
+            for rev in revs:
+                obj = rev.object
+                if obj.__class__ == CMSPlugin and obj.pk == plugin_id:
+                    cms_plugin = obj
+                    break
+            inst, plugin_admin = cms_plugin.get_plugin_instance(plugin_admin_site)
+            instance = None
+            if cms_plugin.get_plugin_class().model == CMSPlugin:
+                instance = cms_plugin
+            else:
+                for rev in revs:
+                    obj = rev.object
+                    if hasattr(obj, &quot;cmsplugin_ptr_id&quot;) and int(obj.cmsplugin_ptr_id) == int(cms_plugin.pk):
+                        instance = obj
+                        break
+            if not instance:
+                raise Http404(&quot;This plugin is not saved in a revision&quot;)
+        
+        plugin_admin.cms_plugin_instance = cms_plugin
+        plugin_admin.placeholder = cms_plugin.placeholder # TODO: what for reversion..? should it be inst ...?
+        
+        if request.method == &quot;POST&quot;:
+            # set the continue flag, otherwise will plugin_admin make redirect to list
+            # view, which actually does'nt exists
+            request.POST['_continue'] = True
+        
+        if 'reversion' in settings.INSTALLED_APPS and ('history' in request.path or 'recover' in request.path):
+            # in case of looking to history just render the plugin content
+            context = RequestContext(request)
+            return render_to_response(plugin_admin.render_template, plugin_admin.render(context, instance, plugin_admin.placeholder))
+        
+        
+        if not instance:
+            # instance doesn't exist, call add view
+            response = plugin_admin.add_view(request)
+     
+        else:
+            # already saved before, call change view
+            # we actually have the instance here, but since i won't override
+            # change_view method, is better if it will be loaded again, so
+            # just pass id to plugin_admin
+            response = plugin_admin.change_view(request, str(plugin_id))
+        
+        if request.method == &quot;POST&quot; and plugin_admin.object_successfully_changed:
+            # if reversion is installed, save version of the page plugins
+            if 'reversion' in settings.INSTALLED_APPS:
+                # perform this only if object was successfully changed
+                cms_plugin.content_object.save()
+                save_all_plugins(request, cms_plugin.content_object, [cms_plugin.pk])
+                revision.user = request.user
+                plugin_name = unicode(plugin_pool.get_plugin(cms_plugin.plugin_type).name)
+                revision.comment = _(u&quot;%(plugin_name)s plugin edited at position %(position)s in %(placeholder)s&quot;) % {'plugin_name':plugin_name, 'position':cms_plugin.position, 'placeholder': cms_plugin.placeholder}
+                
+            # read the saved object from plugin_admin - ugly but works
+            saved_object = plugin_admin.saved_object
+            
+            context = {
+                'CMS_MEDIA_URL': settings.CMS_MEDIA_URL, 
+                'plugin': saved_object, 
+                'is_popup': True, 
+                'name': unicode(saved_object), 
+                &quot;type&quot;: saved_object.get_plugin_name(),
+                'plugin_id': plugin_id,
+                'icon': force_escape(escapejs(saved_object.get_instance_icon_src())),
+                'alt': force_escape(escapejs(saved_object.get_instance_icon_alt())),
+            }
+            return render_to_response('plugin_admin/cms/page/plugin_forms_ok.html', context, RequestContext(request))
+            
+        return response
+            
+    edit_plugin = create_on_success(edit_plugin)
+
+    def move_plugin(self, request):
+        if request.method == &quot;POST&quot; and not 'history' in request.path:
+            pos = 0
+            content_object = None
+            if 'ids' in request.POST:
+                for id in request.POST['ids'].split(&quot;_&quot;):
+                    plugin = CMSPlugin.objects.get(pk=id)
+                    if not content_object:
+                        content_object = plugin.content_object
+                    
+                    if hasattr(content_object, 'has_change_permission') and not content_object.has_change_permission(request):
+                        raise Http404
+        
+                    if plugin.position != pos:
+                        plugin.position = pos
+                        plugin.save()
+                    pos += 1
+            elif 'plugin_id' in request.POST:
+                plugin = CMSPlugin.objects.get(pk=int(request.POST['plugin_id']))
+                content_object = plugin.content_object
+                ctype = ContentType.objects.get_for_model(content_object.__class__)
+                placeholder = request.POST['placeholder']
+                placeholders = get_placeholders(request, plugin.content_object.template)
+                if not placeholder in placeholders:
+                    return HttpResponse(str(&quot;error&quot;))
+                plugin.placeholder = placeholder
+                position = 0
+                try:
+                    position = CMSPlugin.objects.filter(content_type=cytpe, object_id=content_object.object_id, placeholder=placeholder).order_by('position')[0].position + 1
+                except IndexError:
+                    pass
+                plugin.position = position
+                plugin.save()
+            else:
+                HttpResponse(str(&quot;error&quot;))
+            if content_object and 'reversion' in settings.INSTALLED_APPS:
+                content_object.save()
+                save_all_plugins(request, content_object)
+                revision.user = request.user
+                revision.comment = unicode(_(u&quot;Plugins where moved&quot;)) 
+            return HttpResponse(str(&quot;ok&quot;))
+        else:
+            return HttpResponse(str(&quot;error&quot;))
+            
+    move_plugin = create_on_success(move_plugin)
+    
+    def remove_plugin(self, request):
+        if request.method == &quot;POST&quot; and not 'history' in request.path:
+            plugin_id = request.POST['plugin_id']
+            plugin = get_object_or_404(CMSPlugin, pk=plugin_id)
+            content_object = plugin.content_object
+            
+            if hasattr(content_object, 'has_change_permission') and not content_object.has_change_permission(request):
+                raise Http404
+            
+            if settings.CMS_MODERATOR and hasattr(content_object, 'is_under_moderation') and content_object.is_under_moderation():
+                plugin.delete()
+            else:
+                plugin.delete_with_public()
+                
+            plugin_name = unicode(plugin_pool.get_plugin(plugin.plugin_type).name)
+            comment = _(u&quot;%(plugin_name)s plugin at position %(position)s in %(placeholder)s was deleted.&quot;) % {'plugin_name':plugin_name, 'position':plugin.position, 'placeholder':plugin.placeholder}
+            if 'reversion' in settings.INSTALLED_APPS:
+                save_all_plugins(request, content_object)
+                content_object.save()
+                revision.user = request.user
+                revision.comment = comment
+            return HttpResponse(&quot;%s,%s&quot; % (plugin_id, comment))
+        raise Http404
+    
+    remove_plugin = create_on_success(remove_plugin)
+</diff>
      <filename>cms/admin/pluginadmin.py</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,7 @@
 from django.http import Http404
 from django.shortcuts import get_object_or_404
-from cms.utils import get_language_from_request
 from cms.models import Page, Title, CMSPlugin
-
 from django.contrib.contenttypes.models import ContentType
-in = revision.create_on_success(remove_plugin)
     
 def save_all_plugins(request, content_object, excludes=None):
     </diff>
      <filename>cms/admin/views.py</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>8a7b11e8f2bc755ea2e1b9193359c8897bd403e0</id>
    </parent>
  </parents>
  <author>
    <name>Oyvind Saltvik</name>
    <email>oyvind.saltvik@gmail.com</email>
  </author>
  <url>http://github.com/fivethreeo/django-cms-2.0/commit/76cdf2d94211df0c8a2b1eb23b8dd1479cf9ab3d</url>
  <id>76cdf2d94211df0c8a2b1eb23b8dd1479cf9ab3d</id>
  <committed-date>2009-11-05T04:28:58-08:00</committed-date>
  <authored-date>2009-11-05T04:28:58-08:00</authored-date>
  <message>copied some modeladmin methods</message>
  <tree>39c93ee62fb0135d0924b504b4f33c3c65460289</tree>
  <committer>
    <name>Oyvind Saltvik</name>
    <email>oyvind.saltvik@gmail.com</email>
  </committer>
</commit>
