From c33abc1a10eacdaa4b0c9c3b190ce2d796c8efba Mon Sep 17 00:00:00 2001 From: MakeToLearn Date: Fri, 26 Aug 2011 13:21:22 -0400 Subject: [PATCH 1/4] Changed structure and added setup.py file --- .DS_Store | Bin 0 -> 6148 bytes foreignkeysearch/__init__.py | 2 + foreignkeysearch/handler.py | 66 ++++++++++++ .../locale/de/LC_MESSAGES/django.mo | Bin 0 -> 620 bytes .../locale/de/LC_MESSAGES/django.po | 50 +++++++++ .../templates/foreignkeysearch/widget.html | 98 ++++++++++++++++++ foreignkeysearch/tests.py | 23 ++++ foreignkeysearch/urls.py | 6 ++ foreignkeysearch/views.py | 68 ++++++++++++ foreignkeysearch/widgets.py | 74 +++++++++++++ setup.py | 4 + 11 files changed, 391 insertions(+) create mode 100644 .DS_Store create mode 100644 foreignkeysearch/__init__.py create mode 100644 foreignkeysearch/handler.py create mode 100644 foreignkeysearch/locale/de/LC_MESSAGES/django.mo create mode 100644 foreignkeysearch/locale/de/LC_MESSAGES/django.po create mode 100644 foreignkeysearch/templates/foreignkeysearch/widget.html create mode 100644 foreignkeysearch/tests.py create mode 100644 foreignkeysearch/urls.py create mode 100644 foreignkeysearch/views.py create mode 100644 foreignkeysearch/widgets.py create mode 100644 setup.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0' + """ + return '

%s:

' % _('Results') + + def post_results(self): + """ + The return string will be inserted after the result list. + Example: + return '' + """ + return '' + + def no_results(self): + """ + A "no results"-string + """ + return '-- %s --' % _('no results') + + def search(self, params): + """ + Performs a search via __icontains over all fields and returns the resultset + """ + q = Q() + field_list = [f.name for f in self.model._meta.fields] + for k,v in params.iteritems(): + if k in field_list and v != '': + q &= Q(**{('%s__icontains' % k).__str__(): v.__str__()}) + if not q: + return [] + return self.model.objects.filter(q) + + def selected_item(self, obj): + """ + Returns the HTML-Representation of a selected item + """ + try: + return obj.__unicode__() + except: + return obj.__repr__() + + def item(self, obj): + """ + Returns the HTML-Representation of an item in the result list + """ + return mark_safe(u'[link]%(title)s[/link]
' % ({ + 'title': obj + })) \ No newline at end of file diff --git a/foreignkeysearch/locale/de/LC_MESSAGES/django.mo b/foreignkeysearch/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..4182e03df0c06fc2f10f5294d33335547f6e4096 GIT binary patch literal 620 zcmYk2O>Pu15QPmS1Uf;AA`lB$)Cv}nhn`4?r1=pc2@=W-LzsrWXS$}lnT|cOtNA$y zH{cK~*l`ce00%(gxoIIve)?Qhu4l_XcGf;CL;~H08t5AI4T|v-+Jt^V8_;j)GPHi- zZ@vY_{5lvtZh<@CojyP4`^Vr{)K9_aw{{T%x4}4n1MJ?==Xd*j0NzCZ0Ne)8z^mX4 zgp~rid7z8<#^`$mis#m$7}5Ju+#D7K9a<+9do^;VsBH$Zbho+RTJ;}iXs zeSmXD!$F!HIV)`8@@a)@gg?r?Rby)Vkmi-~f#va={JGx8RkmzRi8BQ!>Ls^iY{Mm6 zH8KUOX*;j5Kk+5cY#qYCO4lH3@H, 2011. +# +msgid "" +msgstr "" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-02-02 08:57+0100\n" +"Last-Translator: Stefan T. Oertel \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Language: de\n" + +#: handler.py:22 +msgid "Results" +msgstr "Ergebnisse" + +#: handler.py:36 +msgid "no results" +msgstr "Keine Ergebnisse" + +#: templates/foreignkeysearch/widget.html:7 +#: templates/foreignkeysearch/widget.html:15 +msgid "no object selected" +msgstr "kein Objekt ausgewählt" + +#: templates/foreignkeysearch/widget.html:50 +msgid "Loading" +msgstr "Lade" + +#: templates/foreignkeysearch/widget.html:71 +#: templates/foreignkeysearch/widget.html:94 +msgid "Search" +msgstr "Suchen" + +#: templates/foreignkeysearch/widget.html:84 +msgid "Lookup" +msgstr "Suchen" + +#: templates/foreignkeysearch/widget.html:85 +msgid "Add Another" +msgstr "Neu anlegen" + +#: templates/foreignkeysearch/widget.html:86 +msgid "remove" +msgstr "entfernen" + +#: templates/foreignkeysearch/widget.html:90 +msgid "Search for" +msgstr "Suche nach" diff --git a/foreignkeysearch/templates/foreignkeysearch/widget.html b/foreignkeysearch/templates/foreignkeysearch/widget.html new file mode 100644 index 0000000..f701b7d --- /dev/null +++ b/foreignkeysearch/templates/foreignkeysearch/widget.html @@ -0,0 +1,98 @@ +{% load i18n %} + +
+
+ +{% trans 'Lookup' %} + {% trans 'Add Another' %} +{% trans 'remove' %} +

+ +

+

+
diff --git a/foreignkeysearch/tests.py b/foreignkeysearch/tests.py new file mode 100644 index 0000000..2247054 --- /dev/null +++ b/foreignkeysearch/tests.py @@ -0,0 +1,23 @@ +""" +This file demonstrates two different styles of tests (one doctest and one +unittest). These will both pass when you run "manage.py test". + +Replace these with more appropriate tests for your application. +""" + +from django.test import TestCase + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.failUnlessEqual(1 + 1, 2) + +__test__ = {"doctest": """ +Another way to test that 1 + 1 is equal to 2. + +>>> 1 + 1 == 2 +True +"""} + diff --git a/foreignkeysearch/urls.py b/foreignkeysearch/urls.py new file mode 100644 index 0000000..d7ff201 --- /dev/null +++ b/foreignkeysearch/urls.py @@ -0,0 +1,6 @@ +from django.conf.urls.defaults import * + +urlpatterns = patterns('', + url(r'^search/(?P[a-zA-Z0-9_]+)$', 'foreignkeysearch.views.search', name='foreignkey_search'), + url(r'^get/(?P[a-zA-Z0-9_]+)$', 'foreignkeysearch.views.get_item', name='foreignkey_get'), +) diff --git a/foreignkeysearch/views.py b/foreignkeysearch/views.py new file mode 100644 index 0000000..6d7316f --- /dev/null +++ b/foreignkeysearch/views.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +import re +from django.utils import simplejson +from django.http import HttpResponse +from django.contrib.admin.views.decorators import staff_member_required +from django.views.decorators.csrf import csrf_exempt +from foreignkeysearch import registered_handlers + +@staff_member_required +@csrf_exempt +def search(request, handler): + h = registered_handlers.get(handler, None) + if h is None: + return HttpResponse( + simplejson.dumps({}), + mimetype='application/json' + ) + + related_field_name = h.db_field.name + + # Prepare handler vars + params = {} + for k,v in request.POST.iteritems(): + if k.startswith(related_field_name.lower()+'_'): + params[k[len(related_field_name)+1:]] = v + + results = h.search(params)[:20] + result_list = {} + for r in results: + tmp = h.item(r) + tmp = re.sub(u'\[link\](.*)\[/link\]', '\\1' % ({'id': r.id, 'field':request.GET.get('field', '')}), tmp) + result_list[r.id] = tmp + + + ret_dict = {} + ret_dict['pre'] = h.pre_results() + ret_dict['post'] = h.post_results() + ret_dict['results'] = result_list + ret_dict['no_results'] = h.no_results() + + # Return serialized results + ret = HttpResponse( + simplejson.dumps(ret_dict), + mimetype='application/json' + ) + return ret + +@staff_member_required +def get_item(request, handler): + object_id = request.GET.get('object_id', 0) + h = registered_handlers.get(handler, None) + if h is None: + return HttpResponse( + simplejson.dumps({}), + mimetype='application/json' + ) + try: + obj = h.model.objects.get(id=object_id) + d = {'object_id': object_id, 'value': h.selected_item(obj)} + except Exception, e: + d = {'object_id': '', 'value': ''} + + # Return serialized result + ret = HttpResponse( + simplejson.dumps(d), + mimetype='application/json' + ) + return ret diff --git a/foreignkeysearch/widgets.py b/foreignkeysearch/widgets.py new file mode 100644 index 0000000..821e9c5 --- /dev/null +++ b/foreignkeysearch/widgets.py @@ -0,0 +1,74 @@ +from django import forms +from django.conf import settings +from django.utils.safestring import mark_safe +from django.template import loader, Context + +class NoRelatedField(Exception): + pass + +def get_search_form(m, db_field, exclude): + """ + Create search form dynamically, based on database-field and + list of to-be-excluded fields. The form will be prefixes with + the name of the source field to avoid name conflicts. + """ + if not exclude: + e = () + else: + e = exclude + class DynamicForm(forms.ModelForm): + class Meta: + model = m + prefix = db_field.name + exclude = e + def add_prefix(self, field_name): + return '%s_%s' % (db_field.name, field_name) + return DynamicForm() + +class ForeignKeySearchForm(forms.HiddenInput): + """ + Widget. Transforms the normal foreign key hidden field into a search form. + """ + def __init__(self, search_object=None, db_field=None, handler=None, attrs=None): + self.db_field = db_field + self.handler = handler(db_field=db_field) + try: + self.form = get_search_form(db_field.related.parent_model, db_field, self.handler.exclude) + except Exception, e: + raise NoRelatedField('%s is not a ForeignKey-field' % db_field.name) + + super(ForeignKeySearchForm, self).__init__(attrs) + + def render(self, name, value, attrs=None): + if attrs is None: + attrs = {} + + glasses = 'Lookup' % settings.ADMIN_MEDIA_PREFIX + if not value: + ret = '-- no object selected -- %s' % glasses + + # Load widget template + t = loader.get_template('foreignkeysearch/widget.html') + + # Set template variables + c = Context({ + 'field_name': name.replace('-', '____'), + 'field_name_original': name, + 'field_value': value, + 'field': self.db_field, + 'app_name': self.db_field.model._meta.app_label, + 'model': self.db_field.model, + 'model_name': self.db_field.model.__name__, + 'model_name_verbose': getattr(self.db_field.model._meta, 'verbose_name', self.db_field.model.__name__), + 'related_app_name': self.db_field.related.parent_model._meta.app_label, + 'related_model': self.db_field.related.parent_model, + 'related_model_name': self.db_field.related.parent_model.__name__, + 'related_model_name_verbose': getattr(self.db_field.related.parent_model._meta, 'verbose_name', self.db_field.related.parent_model.__name__), + 'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX, + 'form': self.form, + 'handler_name': self.handler.__class__.__name__, + }) + + # Render widget + content = t.render(c) + return mark_safe(content) diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..7989051 --- /dev/null +++ b/setup.py @@ -0,0 +1,4 @@ +from distutils.core import setup +setup(name='django-foreignkeysearch', + version='1.0', + packages=['foreignkeysearch']) From c84b11a50c219de35ee1134d91f3e52474c3da47 Mon Sep 17 00:00:00 2001 From: MakeToLearn Date: Fri, 26 Aug 2011 13:21:54 -0400 Subject: [PATCH 2/4] stupid DS_Store --- .DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Fri, 26 Aug 2011 13:24:36 -0400 Subject: [PATCH 3/4] Removed files in the wrong folder --- __init__.py | 2 - handler.py | 66 ----------------- locale/de/LC_MESSAGES/django.mo | Bin 620 -> 0 bytes locale/de/LC_MESSAGES/django.po | 50 ------------- setup.py | 4 - templates/foreignkeysearch/widget.html | 98 ------------------------- tests.py | 23 ------ urls.py | 6 -- views.py | 68 ----------------- widgets.py | 74 ------------------- 10 files changed, 391 deletions(-) delete mode 100644 __init__.py delete mode 100644 handler.py delete mode 100644 locale/de/LC_MESSAGES/django.mo delete mode 100644 locale/de/LC_MESSAGES/django.po delete mode 100644 setup.py delete mode 100644 templates/foreignkeysearch/widget.html delete mode 100644 tests.py delete mode 100644 urls.py delete mode 100644 views.py delete mode 100644 widgets.py diff --git a/__init__.py b/__init__.py deleted file mode 100644 index 9ae5607..0000000 --- a/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -registered_handlers = {} - diff --git a/handler.py b/handler.py deleted file mode 100644 index f51927b..0000000 --- a/handler.py +++ /dev/null @@ -1,66 +0,0 @@ -from django.db.models import Q -from django.utils.safestring import mark_safe -from django.utils.translation import ugettext as _ - -class BaseHandler(object): - resultset = None - exclude = () - - def __init__(self, db_field=None): - # Register instance globally - from foreignkeysearch import registered_handlers - self.db_field = db_field - if not self.__class__.__name__ in registered_handlers: - registered_handlers[self.__class__.__name__] = self - - def pre_results(self): - """ - The return string will be inserted before the result list - Example: - return '' - """ - return '

%s:

' % _('Results') - - def post_results(self): - """ - The return string will be inserted after the result list. - Example: - return '
' - """ - return '' - - def no_results(self): - """ - A "no results"-string - """ - return '-- %s --' % _('no results') - - def search(self, params): - """ - Performs a search via __icontains over all fields and returns the resultset - """ - q = Q() - field_list = [f.name for f in self.model._meta.fields] - for k,v in params.iteritems(): - if k in field_list and v != '': - q &= Q(**{('%s__icontains' % k).__str__(): v.__str__()}) - if not q: - return [] - return self.model.objects.filter(q) - - def selected_item(self, obj): - """ - Returns the HTML-Representation of a selected item - """ - try: - return obj.__unicode__() - except: - return obj.__repr__() - - def item(self, obj): - """ - Returns the HTML-Representation of an item in the result list - """ - return mark_safe(u'[link]%(title)s[/link]
' % ({ - 'title': obj - })) \ No newline at end of file diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index 4182e03df0c06fc2f10f5294d33335547f6e4096..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmYk2O>Pu15QPmS1Uf;AA`lB$)Cv}nhn`4?r1=pc2@=W-LzsrWXS$}lnT|cOtNA$y zH{cK~*l`ce00%(gxoIIve)?Qhu4l_XcGf;CL;~H08t5AI4T|v-+Jt^V8_;j)GPHi- zZ@vY_{5lvtZh<@CojyP4`^Vr{)K9_aw{{T%x4}4n1MJ?==Xd*j0NzCZ0Ne)8z^mX4 zgp~rid7z8<#^`$mis#m$7}5Ju+#D7K9a<+9do^;VsBH$Zbho+RTJ;}iXs zeSmXD!$F!HIV)`8@@a)@gg?r?Rby)Vkmi-~f#va={JGx8RkmzRi8BQ!>Ls^iY{Mm6 zH8KUOX*;j5Kk+5cY#qYCO4lH3@H, 2011. -# -msgid "" -msgstr "" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-02-02 08:57+0100\n" -"Last-Translator: Stefan T. Oertel \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Language: de\n" - -#: handler.py:22 -msgid "Results" -msgstr "Ergebnisse" - -#: handler.py:36 -msgid "no results" -msgstr "Keine Ergebnisse" - -#: templates/foreignkeysearch/widget.html:7 -#: templates/foreignkeysearch/widget.html:15 -msgid "no object selected" -msgstr "kein Objekt ausgewählt" - -#: templates/foreignkeysearch/widget.html:50 -msgid "Loading" -msgstr "Lade" - -#: templates/foreignkeysearch/widget.html:71 -#: templates/foreignkeysearch/widget.html:94 -msgid "Search" -msgstr "Suchen" - -#: templates/foreignkeysearch/widget.html:84 -msgid "Lookup" -msgstr "Suchen" - -#: templates/foreignkeysearch/widget.html:85 -msgid "Add Another" -msgstr "Neu anlegen" - -#: templates/foreignkeysearch/widget.html:86 -msgid "remove" -msgstr "entfernen" - -#: templates/foreignkeysearch/widget.html:90 -msgid "Search for" -msgstr "Suche nach" diff --git a/setup.py b/setup.py deleted file mode 100644 index 7989051..0000000 --- a/setup.py +++ /dev/null @@ -1,4 +0,0 @@ -from distutils.core import setup -setup(name='django-foreignkeysearch', - version='1.0', - packages=['foreignkeysearch']) diff --git a/templates/foreignkeysearch/widget.html b/templates/foreignkeysearch/widget.html deleted file mode 100644 index f701b7d..0000000 --- a/templates/foreignkeysearch/widget.html +++ /dev/null @@ -1,98 +0,0 @@ -{% load i18n %} - -
-
- -{% trans 'Lookup' %} - {% trans 'Add Another' %} -{% trans 'remove' %} -

- -

-

-
diff --git a/tests.py b/tests.py deleted file mode 100644 index 2247054..0000000 --- a/tests.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -This file demonstrates two different styles of tests (one doctest and one -unittest). These will both pass when you run "manage.py test". - -Replace these with more appropriate tests for your application. -""" - -from django.test import TestCase - -class SimpleTest(TestCase): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - self.failUnlessEqual(1 + 1, 2) - -__test__ = {"doctest": """ -Another way to test that 1 + 1 is equal to 2. - ->>> 1 + 1 == 2 -True -"""} - diff --git a/urls.py b/urls.py deleted file mode 100644 index d7ff201..0000000 --- a/urls.py +++ /dev/null @@ -1,6 +0,0 @@ -from django.conf.urls.defaults import * - -urlpatterns = patterns('', - url(r'^search/(?P[a-zA-Z0-9_]+)$', 'foreignkeysearch.views.search', name='foreignkey_search'), - url(r'^get/(?P[a-zA-Z0-9_]+)$', 'foreignkeysearch.views.get_item', name='foreignkey_get'), -) diff --git a/views.py b/views.py deleted file mode 100644 index 6d7316f..0000000 --- a/views.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -import re -from django.utils import simplejson -from django.http import HttpResponse -from django.contrib.admin.views.decorators import staff_member_required -from django.views.decorators.csrf import csrf_exempt -from foreignkeysearch import registered_handlers - -@staff_member_required -@csrf_exempt -def search(request, handler): - h = registered_handlers.get(handler, None) - if h is None: - return HttpResponse( - simplejson.dumps({}), - mimetype='application/json' - ) - - related_field_name = h.db_field.name - - # Prepare handler vars - params = {} - for k,v in request.POST.iteritems(): - if k.startswith(related_field_name.lower()+'_'): - params[k[len(related_field_name)+1:]] = v - - results = h.search(params)[:20] - result_list = {} - for r in results: - tmp = h.item(r) - tmp = re.sub(u'\[link\](.*)\[/link\]', '\\1' % ({'id': r.id, 'field':request.GET.get('field', '')}), tmp) - result_list[r.id] = tmp - - - ret_dict = {} - ret_dict['pre'] = h.pre_results() - ret_dict['post'] = h.post_results() - ret_dict['results'] = result_list - ret_dict['no_results'] = h.no_results() - - # Return serialized results - ret = HttpResponse( - simplejson.dumps(ret_dict), - mimetype='application/json' - ) - return ret - -@staff_member_required -def get_item(request, handler): - object_id = request.GET.get('object_id', 0) - h = registered_handlers.get(handler, None) - if h is None: - return HttpResponse( - simplejson.dumps({}), - mimetype='application/json' - ) - try: - obj = h.model.objects.get(id=object_id) - d = {'object_id': object_id, 'value': h.selected_item(obj)} - except Exception, e: - d = {'object_id': '', 'value': ''} - - # Return serialized result - ret = HttpResponse( - simplejson.dumps(d), - mimetype='application/json' - ) - return ret diff --git a/widgets.py b/widgets.py deleted file mode 100644 index 821e9c5..0000000 --- a/widgets.py +++ /dev/null @@ -1,74 +0,0 @@ -from django import forms -from django.conf import settings -from django.utils.safestring import mark_safe -from django.template import loader, Context - -class NoRelatedField(Exception): - pass - -def get_search_form(m, db_field, exclude): - """ - Create search form dynamically, based on database-field and - list of to-be-excluded fields. The form will be prefixes with - the name of the source field to avoid name conflicts. - """ - if not exclude: - e = () - else: - e = exclude - class DynamicForm(forms.ModelForm): - class Meta: - model = m - prefix = db_field.name - exclude = e - def add_prefix(self, field_name): - return '%s_%s' % (db_field.name, field_name) - return DynamicForm() - -class ForeignKeySearchForm(forms.HiddenInput): - """ - Widget. Transforms the normal foreign key hidden field into a search form. - """ - def __init__(self, search_object=None, db_field=None, handler=None, attrs=None): - self.db_field = db_field - self.handler = handler(db_field=db_field) - try: - self.form = get_search_form(db_field.related.parent_model, db_field, self.handler.exclude) - except Exception, e: - raise NoRelatedField('%s is not a ForeignKey-field' % db_field.name) - - super(ForeignKeySearchForm, self).__init__(attrs) - - def render(self, name, value, attrs=None): - if attrs is None: - attrs = {} - - glasses = 'Lookup' % settings.ADMIN_MEDIA_PREFIX - if not value: - ret = '-- no object selected -- %s' % glasses - - # Load widget template - t = loader.get_template('foreignkeysearch/widget.html') - - # Set template variables - c = Context({ - 'field_name': name.replace('-', '____'), - 'field_name_original': name, - 'field_value': value, - 'field': self.db_field, - 'app_name': self.db_field.model._meta.app_label, - 'model': self.db_field.model, - 'model_name': self.db_field.model.__name__, - 'model_name_verbose': getattr(self.db_field.model._meta, 'verbose_name', self.db_field.model.__name__), - 'related_app_name': self.db_field.related.parent_model._meta.app_label, - 'related_model': self.db_field.related.parent_model, - 'related_model_name': self.db_field.related.parent_model.__name__, - 'related_model_name_verbose': getattr(self.db_field.related.parent_model._meta, 'verbose_name', self.db_field.related.parent_model.__name__), - 'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX, - 'form': self.form, - 'handler_name': self.handler.__class__.__name__, - }) - - # Render widget - content = t.render(c) - return mark_safe(content) From 14a433277752a95bc7d95c655d7f379abbd356c7 Mon Sep 17 00:00:00 2001 From: MakeToLearn Date: Fri, 26 Aug 2011 13:24:57 -0400 Subject: [PATCH 4/4] Restored setup.py --- setup.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 setup.py diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..7989051 --- /dev/null +++ b/setup.py @@ -0,0 +1,4 @@ +from distutils.core import setup +setup(name='django-foreignkeysearch', + version='1.0', + packages=['foreignkeysearch'])