diff --git a/example_project/sample_image_insert/templates/servee/wysiwyg/insert/sample_image_insert/_list.html b/example_project/sample_image_insert/templates/servee/wysiwyg/insert/sample_image_insert/_list.html index 4275f18..ef130b1 100644 --- a/example_project/sample_image_insert/templates/servee/wysiwyg/insert/sample_image_insert/_list.html +++ b/example_project/sample_image_insert/templates/servee/wysiwyg/insert/sample_image_insert/_list.html @@ -1,8 +1,7 @@ {% load insert_tags %} -{% load uni_form_tags %}
{% csrf_token %} - {{ form|as_uni_form }} + {{ form.as_p }}
diff --git a/servee/__init__.py b/servee/__init__.py index e7e4407..dec54ec 100644 --- a/servee/__init__.py +++ b/servee/__init__.py @@ -1,5 +1,5 @@ VERSION = (0, 6, 0, "a", 1) # following PEP 386 -DEV_N = "14" +DEV_N = "15" # cribbed from pinax diff --git a/servee/frontendadmin/options.py b/servee/frontendadmin/options.py index 04d15e9..f1b89f8 100644 --- a/servee/frontendadmin/options.py +++ b/servee/frontendadmin/options.py @@ -1,6 +1,21 @@ from django.contrib.admin.options import ModelAdmin, StackedInline, TabularInline +from django.contrib.admin.views.main import ChangeList +from django.contrib.admin.util import quote from django.http import HttpResponse, HttpResponseRedirect +class ServeeChangeList(ChangeList): + """ + I need full path links everywhere in the admin, so I subclassed the changelist + """ + + def url_for_result(self, result): + return "/servee/%s/%s/%s/" % ( + self.model._meta.app_label, + self.model._meta.object_name.lower(), + quote(getattr(result, self.pk_attname)), + ) + + class ServeeModelAdmin(ModelAdmin): """ ServeeModelAdmin is just like the normal ModelAdmin, but with a larger pool of default @@ -125,6 +140,9 @@ def add_view(self, *args, **kwargs): }) return super(ServeeModelAdmin, self).add_view(*args, **kwargs) + def get_changelist(self, request, **kwargs): + return ServeeChangeList + class ServeeStackedInline(StackedInline): template = 'servee/edit_inline/stacked.html' diff --git a/servee/frontendadmin/static/servee/js/frontendadmin.js b/servee/frontendadmin/static/servee/js/frontendadmin.js index 03627c3..6aeb659 100644 --- a/servee/frontendadmin/static/servee/js/frontendadmin.js +++ b/servee/frontendadmin/static/servee/js/frontendadmin.js @@ -2,29 +2,82 @@ $(document).ready(function(){ /* Frontendadmin buttons add, edit, delete */ $("a.frontendadmin_edit:not(.modal)").hover( - function(){$(this).parent().addClass("pre-edit");}, - function(){$(this).parent().removeClass("pre-edit");} + function(){ + if ((typeof(servee) != "undefined") && (typeof(servee.selector) != "undefined")){ + $par = $(servee.selector); + } + else { + $par = $link.parent(); + } + $par.addClass("pre-edit"); + }, + function(){ + if ((typeof(servee) != "undefined") && (typeof(servee.selector) != "undefined")){ + $par = $(servee.selector); + } + else { + $par = $link.parent(); + } + $par.removeClass("pre-edit"); + } ); $("a.frontendadmin_delete:not(.modal)").hover( - function(){$(this).parent().addClass("pre-delete");}, - function(){$(this).parent().removeClass("pre-delete");} + function(){ + if ((typeof(servee) != "undefined") && (typeof(servee.selector) != "undefined")){ + $par = $(servee.selector); + } + else { + $par = $link.parent(); + } + $par.addClass("pre-delete"); + }, + function(){ + if ((typeof(servee) != "undefined") && (typeof(servee.selector) != "undefined")){ + $par = $(servee.selector); + } + else { + $par = $link.parent(); + } + $par.removeClass("pre-delete"); + } ); $("a.frontendadmin_add").live("click", function(e){ - var $base, $link = $(this), $par = $link.parent(); + var $base, $link = $(this); + + if ((typeof(servee) != "undefined") && (typeof(servee.selector) != "undefined")){ + $par = $(servee.selector); + } + else { + $par = $link.parent(); + } + + $.ajax({ + url: this.href, + success: function(data, text){ + $par.html(data); + } + }); + e.preventDefault(); + return false; + }); + + + $("a.frontendadmin_list").live("click", function(e){ + var $base, $link = $(this); + + if ((typeof(servee) != "undefined") && (typeof(servee.selector) != "undefined")){ + $par = $(servee.selector); + } + else { + $par = $link.parent(); + } $.ajax({ url: this.href, success: function(data, text){ - if ($link.hasClass("modal")){ - $.fancybox({ - content: data, - }); - } - else { - $par.html(data); - } + $par.html(data); } }); e.preventDefault(); @@ -35,18 +88,18 @@ $(document).ready(function(){ $("a.frontendadmin_edit").live("click", function(e){ var $base, $link = $(this), $par = $link.parent(); + if ((typeof(servee) != "undefined") && (typeof(servee.selector) != "undefined")){ + $par = $(servee.selector); + } + else { + $par = $link.parent(); + } + $par.css("outline", ""); $.ajax({ url: this.href, success: function(data, text){ - if ($link.hasClass("modal")){ - $.fancybox({ - content: data, - }); - } - else { - $par.html(data); - } + $par.html(data); } }); e.preventDefault(); @@ -90,7 +143,6 @@ $(document).ready(function(){ $.ajax({ url: $link.attr("href"), success: function(data, text){ - console.log(data); $(".srv_insertOptions").remove(); $(".srv_filePane").after( "
" diff --git a/servee/frontendadmin/templates/servee/search_form.html b/servee/frontendadmin/templates/servee/_search_form.html similarity index 91% rename from servee/frontendadmin/templates/servee/search_form.html rename to servee/frontendadmin/templates/servee/_search_form.html index 3e14a11..1693204 100644 --- a/servee/frontendadmin/templates/servee/search_form.html +++ b/servee/frontendadmin/templates/servee/_search_form.html @@ -1,7 +1,7 @@ {% load adminmedia %} {% load i18n %} {% if cl.search_fields %} -
+
diff --git a/servee/frontendadmin/templates/servee/auth/user/change_password.html b/servee/frontendadmin/templates/servee/auth/user/change_password.html index 8d0b064..f66e93a 100644 --- a/servee/frontendadmin/templates/servee/auth/user/change_password.html +++ b/servee/frontendadmin/templates/servee/auth/user/change_password.html @@ -1,6 +1,6 @@ {% extends "servee/base_site.html" %} {% load i18n admin_modify adminmedia %} -{% load url from future %} +" {% block extrahead %}{{ block.super }} {% url 'admin:jsi18n' as jsi18nurl %} diff --git a/servee/frontendadmin/templates/servee/base.html b/servee/frontendadmin/templates/servee/base.html index 35031e5..370cfcc 100644 --- a/servee/frontendadmin/templates/servee/base.html +++ b/servee/frontendadmin/templates/servee/base.html @@ -1,4 +1,4 @@ -{% load url from future %} +" {% block title %}{% endblock %} diff --git a/servee/frontendadmin/templates/servee/change_form.html b/servee/frontendadmin/templates/servee/change_form.html index 12bf1f1..54cb0b6 100644 --- a/servee/frontendadmin/templates/servee/change_form.html +++ b/servee/frontendadmin/templates/servee/change_form.html @@ -1,6 +1,6 @@ {% extends "servee/base_site.html" %} {% load i18n admin_modify servee_admin_modify adminmedia %} -{% load url from future %} +" {% block extrahead %}{{ block.super }} {% url 'admin:jsi18n' as jsi18nurl %} diff --git a/servee/frontendadmin/templates/servee/change_list.html b/servee/frontendadmin/templates/servee/change_list.html index 82a524b..4034315 100644 --- a/servee/frontendadmin/templates/servee/change_list.html +++ b/servee/frontendadmin/templates/servee/change_list.html @@ -1,6 +1,6 @@ {% extends "servee/base_site.html" %} -{% load adminmedia admin_list i18n %} -{% load url from future %} +{% load adminmedia admin_list servee_admin_list i18n %} +" {% block extrastyle %} {{ block.super }} @@ -35,22 +35,6 @@ {% block bodyclass %}change-list{% endblock %} -{% if not is_popup %} - {% block breadcrumbs %} - - {% endblock %} -{% endif %} - {% block coltype %}flex{% endblock %} {% block content %} @@ -75,7 +59,7 @@ {{ cl.formset.non_form_errors }} {% endif %}
- {% block search %}{% search_form cl %}{% endblock %} + {% block search %}{% search_form_servee cl %}{% endblock %} {% block date_hierarchy %}{% date_hierarchy cl %}{% endblock %} {% block filters %} @@ -87,7 +71,7 @@

{% trans 'Filter' %}

{% endif %} {% endblock %} - {% csrf_token %} + {% csrf_token %} {% if cl.formset %} {{ cl.formset.management_form }} {% endif %} @@ -101,4 +85,28 @@

{% trans 'Filter' %}

-{% endblock %} + + {% endblock %} diff --git a/servee/frontendadmin/templatetags/frontendadmin_tags.py b/servee/frontendadmin/templatetags/frontendadmin_tags.py index 61709d6..a243363 100644 --- a/servee/frontendadmin/templatetags/frontendadmin_tags.py +++ b/servee/frontendadmin/templatetags/frontendadmin_tags.py @@ -2,6 +2,7 @@ from classytags.arguments import Argument from django import template from django.core.urlresolvers import reverse +from django.contrib.contenttypes.models import ContentType from django.db.models import Model from django.db.models.query import QuerySet from django.utils.translation import ugettext_lazy as _ @@ -20,14 +21,21 @@ class AddObject(Tag): name = "frontendadmin_add" options = Options( - Argument('queryset_instance', required=True), + Argument('querysetish', required=True), Argument('label', required=False, resolve=False), Argument('add_class', required=False, resolve=False) ) - def render_tag(self, context, queryset_instance, label=None, add_class=None): - if not isinstance(queryset_instance, QuerySet): - raise template.TemplateSyntaxError, "'%s' argument must be a queryset" % queryset_instance + def render_tag(self, context, querysetish, label=None, add_class=None): + if isinstance(querysetish, basestring): + app_label, model_name = querysetish.lower().split(".") + content_type = ContentType.objects.get(app_label=app_label, model=model_name) + model = content_type.model_class() + queryset_instance = model._default_manager.get_query_set() + elif isinstance(querysetish, QuerySet): + queryset_instance = querysetish + else: + raise template.TemplateSyntaxError, "'%s' argument must be a queryset or string representation" % queryset_instance user = context["request"].user app_label = queryset_instance.model._meta.app_label @@ -66,7 +74,6 @@ def render_tag(self, context, model_instance, label=None, add_class=None): return "" if not label: - print "derp" label = _("Change") return '%s' % ( @@ -79,6 +86,49 @@ def render_tag(self, context, model_instance, label=None, add_class=None): unicode(label) ) + +class ListObjects(Tag): + name = "frontendadmin_list" + + options = Options( + Argument('modelish', required=True), + Argument('label', required=False, resolve=False), + Argument('add_class', required=False, resolve=False) + ) + + def render_tag(self, context, modelish, label=None, add_class=None): + if isinstance(modelish, basestring): + app_label, model_name = modelish.lower().split(".") + content_type = ContentType.objects.get(app_label=app_label, model=model_name) + model = content_type.model_class() + elif isinstance(modelish, QuerySet): + model = modelish.model + elif isinstance(modelish, Model): + model = modelish + else: + raise template.TemplateSyntaxError, "'%s' argument must be a model-instance, queryset, or string representation" % modelish + + user = context["request"].user + app_label = model._meta.app_label + model_name = model._meta.module_name + + if not check_permission(user, "change", app_label, model_name): + return "" + + if not label: + label = _("List") + + return '%s' % ( + add_class, + reverse("servee:%s_%s_changelist" % ( + app_label, + model_name, + ) + ), + unicode(label) + ) + + class DeleteObject(Tag): name = "frontendadmin_delete" @@ -114,4 +164,5 @@ def render_tag(self, context, model_instance, label=None, add_class=None): register.tag(AddObject) register.tag(ChangeObject) -register.tag(DeleteObject) \ No newline at end of file +register.tag(DeleteObject) +register.tag(ListObjects) \ No newline at end of file diff --git a/servee/frontendadmin/templatetags/servee_admin_list.py b/servee/frontendadmin/templatetags/servee_admin_list.py new file mode 100644 index 0000000..7e58cc8 --- /dev/null +++ b/servee/frontendadmin/templatetags/servee_admin_list.py @@ -0,0 +1,15 @@ +from django import template +register = template.Library() + +def search_form_servee(context, cl): + """ + Yet another thing I had to subclass strictly so + I could put a proper full-url into a form action or a link + """ + return { + "request": context["request"], + "cl": cl, + "show_result_count": cl.result_count != cl.full_result_count, + "search_var": "q" + } +search_form_servee = register.inclusion_tag("servee/_search_form.html", takes_context=True)(search_form_servee) \ No newline at end of file diff --git a/servee/frontendadmin/templatetags/servee_admin_modify.py b/servee/frontendadmin/templatetags/servee_admin_modify.py index 8b2b959..d1c8b49 100644 --- a/servee/frontendadmin/templatetags/servee_admin_modify.py +++ b/servee/frontendadmin/templatetags/servee_admin_modify.py @@ -1,25 +1,5 @@ from django import template - +from django.contrib.admin.templatetags.admin_modify import submit_row register = template.Library() -def submit_row_frontendadmin(context): - """ - Displays the row of buttons for delete and save. - """ - opts = context['opts'] - change = context['change'] - is_popup = context['is_popup'] - save_as = context['save_as'] - return { - 'onclick_attrib': (opts.get_ordered_objects() and change - and 'onclick="submitOrderForm();"' or ''), - 'show_delete_link': (not is_popup and context['has_delete_permission'] - and (change or context['show_delete'])), - 'show_save_as_new': not is_popup and change and save_as, - 'show_save_and_add_another': context['has_add_permission'] and - not is_popup and (not save_as or context['add']), - 'show_save_and_continue': not is_popup and context['has_change_permission'], - 'is_popup': is_popup, - 'show_save': True - } -submit_row = register.inclusion_tag('servee/_submit_line.html', takes_context=True)(submit_row_frontendadmin) \ No newline at end of file +submit_row = register.inclusion_tag('servee/_submit_line.html', takes_context=True)(submit_row) \ No newline at end of file diff --git a/setup.py b/setup.py index 86bb296..58fbf7f 100644 --- a/setup.py +++ b/setup.py @@ -110,15 +110,11 @@ def find_package_data( author = 'Issac Kelly', author_email = 'issac@servee.com', packages = find_packages(exclude=["example_project*",]), - package_data = find_package_data('servee',only_in_packages=False), + package_data = find_package_data('servee', only_in_packages=False), install_requires = [ - 'Django==1.3', - 'django-uni-form>=0.7', + 'Django>=1.2.5', 'django-classy-tags', ], - #tests_require = [ - # 'Django', 'django-classy-tags', 'django-uni-form' - #], include_package_data=True, classifiers = [ 'Development Status :: 3 - Alpha',