コード例 #1
0
ファイル: admin.py プロジェクト: soitun/dg
    def search(self, request):
        """
        Searches in the fields of the given related model and returns the
        result as a simple string to be used by the jQuery Autocomplete plugin
        """
        query = request.GET.get('q', None)
        app_label = request.GET.get('app_label', None)
        model_name = request.GET.get('model_name', None)
        search_fields = request.GET.get('search_fields', None)

        if search_fields and app_label and model_name and query:
            def construct_search(field_name):
        # use different lookup methods depending on the notation
                if field_name.startswith('^'):
                    return "%s__istartswith" % field_name[1:]
                elif field_name.startswith('='):
                    return "%s__iexact" % field_name[1:]
                elif field_name.startswith('@'):
                    return "%s__search" % field_name[1:]
                else:
                    return "%s__icontains" % field_name

            model = models.get_model(app_label, model_name)
            qs = model._default_manager.all()
            for bit in query.split():
                or_queries = [models.Q(**{construct_search(
                    smart_str(field_name)): smart_str(bit)})
                        for field_name in search_fields.split(',')]
                other_qs = QuerySet(model)
                other_qs.dup_select_related(qs)
                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                qs = qs & other_qs
            data = ''.join([u'%s|%s\n' % (f.__unicode__(), f.pk) for f in qs])
            return HttpResponse(data)
        return HttpResponseNotFound()
コード例 #2
0
    def get_searched_queryset(self, qs):
        model = self.model
        term = self.GET["term"]

        try:
            term = model.autocomplete_term_adjust(term)
        except AttributeError:
            pass

        try:
            search_fields = model.autocomplete_search_fields()
        except AttributeError:
            search_fields = AUTOCOMPLETE_SEARCH_FIELDS[model._meta.app_label][
                model._meta.module_name]
        except KeyError:
            search_fields = ()

        for word in term.split():
            search = [
                models.Q(**{smart_bytes(item): smart_bytes(word)})
                for item in search_fields
            ]
            search_qs = QuerySet(model)
            search_qs.dup_select_related(qs)
            search_qs = search_qs.filter(reduce(operator.or_, search))
            qs &= search_qs
        return qs
コード例 #3
0
def autocomplete_lookup(request):
    if not (request.user.is_active and request.user.is_staff):
        return HttpResponseForbidden('<h1>Permission denied</h1>')
    data = []
    if request.method == 'GET':
        if request.GET.has_key('term') and request.GET.has_key('app_label') and request.GET.has_key('model_name'):
            term = request.GET.get("term")
            app_label = request.GET.get('app_label')
            model_name = request.GET.get('model_name')
            model = models.get_model(app_label, model_name)
            filters = {}
            # FILTER
            if request.GET.get('query_string', None):
                for item in request.GET.get('query_string').split("&"):
                    if item.split("=")[0] != "t":
                        filters[smart_str(item.split("=")[0])]=smart_str(item.split("=")[1])
            # SEARCH
            qs = model._default_manager.all()
            for bit in term.split():
                search = [models.Q(**{smart_str(item):smart_str(bit)}) for item in model.autocomplete_search_fields()]
                search_qs = QuerySet(model)
                search_qs.dup_select_related(qs)
                search_qs = search_qs.filter(reduce(operator.or_, search))
                qs = qs & search_qs
            data = [{"value":f.pk,"label":u'%s' % get_label(f)} for f in qs[:10]]
            label = ungettext(
                '%(counter)s result',
                '%(counter)s results',
            len(data)) % {
                'counter': len(data),
            }
            #data.insert(0, {"value":None,"label":label})
            return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
    data = [{"value":None,"label":_("Server error")}]
    return HttpResponse(simplejson.dumps(data), mimetype='application/javascript')
コード例 #4
0
ファイル: models.py プロジェクト: esauro/akademic
    def search (query):
        contactos = Contacto.objects.filter (
                reduce (operator.or_, [ models.Q(dato__icontains = bit) for bit in query.split() ])
            )

        search_fields = [
                'nombre__icontains',
                'apellidos__icontains',
                'documento_identificacion__icontains',
                'lugar_nacimiento__icontains',
                'nacionalidad__icontains',
            ] # your search fields here

        personasEncontradas = QuerySet(Persona)
        for bit in query.split (): 
            or_queries = [models.Q(**{field_name: bit}) for field_name in search_fields]
            other_qs = QuerySet(Persona)
            other_qs.dup_select_related(personasEncontradas)
            other_qs = other_qs.filter(reduce(operator.or_, or_queries))
            personasEncontradas = personasEncontradas & other_qs

        pe = []
        for p in personasEncontradas:
            pe.append (p)
        for c in contactos:
            if c.persona not in pe:
                pe.append (c.persona)

        return pe
コード例 #5
0
ファイル: appview.py プロジェクト: strogo/djpcms
    def appquery(self, djp):
        '''This function implements the search query.
The query is build using the search fields specifies in
:attr:`djpcms.views.appsite.ModelApplication.search_fields`.
It returns a queryset.
        '''
        qs = super(SearchView,self).appquery(djp)
        request = djp.request
        slist = self.appmodel.opts.search_fields
        if request.method == 'GET':
            data = dict(request.GET.items())
        else:
            data = dict(request.POST.items())
        search_string = data.get(self.search_text,None)
        if slist and search_string:
            bits  = smart_split(search_string)
            #bits  = search_string.split(' ')
            for bit in bits:
                bit = isexact(bit)
                if not bit:
                    continue
                or_queries = [Q(**{construct_search(field_name): bit}) for field_name in slist]
                other_qs   = QuerySet(self.appmodel.modelsearch())
                other_qs.dup_select_related(qs)
                other_qs   = other_qs.filter(reduce(operator.or_, or_queries))
                qs         = qs & other_qs    
        return qs
コード例 #6
0
ファイル: models.py プロジェクト: esauro/SingularMS
    def search (query, user):
        datos_contactos = DatoContacto.objects.filter (
                reduce (operator.or_, [ models.Q(dato__icontains = bit, contacto__usuario = user) for bit in query.split() ])
            )

        search_fields = ['domicilio', 'codPostal', 'poblacion', 'provincia', 'pais']
        direccion_contactos = QuerySet(Direccion)
        for bit in query.split (): 
            or_queries = [models.Q(**{'%s__icontains' % field_name: bit, 'contacto__usuario': user}) for field_name in search_fields]
            other_qs = QuerySet(Direccion)
            other_qs.dup_select_related(direccion_contactos)
            other_qs = other_qs.filter(reduce(operator.or_, or_queries))
            direccion_contactos = direccion_contactos & other_qs
        
        search_fields = ['nombre', 'apellidos', ] # your search fields here
        personasEncontradas = QuerySet(Contacto)
        for bit in query.split (): 
            or_queries = [models.Q(**{'%s__icontains' % field_name: bit, 'usuario': user}) for field_name in search_fields]
            other_qs = QuerySet(Contacto)
            other_qs.dup_select_related(personasEncontradas)
            other_qs = other_qs.filter(reduce(operator.or_, or_queries))
            personasEncontradas = personasEncontradas & other_qs

        pe = []
        for p in personasEncontradas:
            pe.append(p)
        for c in datos_contactos:
            if c.contacto not in pe:
                pe.append(c.contacto)
        for d in direccion_contactos:
            if d.contacto not in pe:
                pe.append(d.contacto)

        return pe
コード例 #7
0
ファイル: admin.py プロジェクト: shraddhamaheshwari/dg
    def search(self, request):
        """
        Searches in the fields of the given related model and returns the
        result as a simple string to be used by the jQuery Autocomplete plugin
        """
        query = request.GET.get('q', None)
        app_label = request.GET.get('app_label', None)
        model_name = request.GET.get('model_name', None)
        search_fields = request.GET.get('search_fields', None)

        if search_fields and app_label and model_name and query:
            def construct_search(field_name):
        # use different lookup methods depending on the notation
                if field_name.startswith('^'):
                    return "%s__istartswith" % field_name[1:]
                elif field_name.startswith('='):
                    return "%s__iexact" % field_name[1:]
                elif field_name.startswith('@'):
                    return "%s__search" % field_name[1:]
                else:
                    return "%s__icontains" % field_name

            model = models.get_model(app_label, model_name)
            qs = model._default_manager.all()
            for bit in query.split():
                or_queries = [models.Q(**{construct_search(
                    smart_str(field_name)): smart_str(bit)})
                        for field_name in search_fields.split(',')]
                other_qs = QuerySet(model)
                other_qs.dup_select_related(qs)
                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                qs = qs & other_qs
            data = ''.join([u'%s|%s\n' % (f.__unicode__(), f.pk) for f in qs])
            return HttpResponse(data)
        return HttpResponseNotFound()
コード例 #8
0
ファイル: main.py プロジェクト: hfeeki/geodjango
    def get_query_set(self):
        qs = self.manager.get_query_set()
        lookup_params = self.params.copy() # a dictionary of the query string
        for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR):
            if i in lookup_params:
                del lookup_params[i]
        for key, value in lookup_params.items():
            if not isinstance(key, str):
                # 'key' will be used as a keyword argument later, so Python
                # requires it to be a string.
                del lookup_params[key]
                lookup_params[smart_str(key)] = value

        # Apply lookup parameters from the query string.
        qs = qs.filter(**lookup_params)

        # Use select_related() if one of the list_display options is a field
        # with a relationship.
        if self.lookup_opts.admin.list_select_related:
            qs = qs.select_related()
        else:
            for field_name in self.lookup_opts.admin.list_display:
                try:
                    f = self.lookup_opts.get_field(field_name)
                except models.FieldDoesNotExist:
                    pass
                else:
                    if isinstance(f.rel, models.ManyToOneRel):
                        qs = qs.select_related()
                        break

        # Set ordering.
        if self.order_field:
            qs = qs.order_by('%s%s' % ((self.order_type == 'desc' and '-' or ''), self.order_field))

        # Apply keyword searches.
        def construct_search(field_name):
            if field_name.startswith('^'):
                return "%s__istartswith" % field_name[1:]
            elif field_name.startswith('='):
                return "%s__iexact" % field_name[1:]
            elif field_name.startswith('@'):
                return "%s__search" % field_name[1:]
            else:
                return "%s__icontains" % field_name

        if self.lookup_opts.admin.search_fields and self.query:
            for bit in self.query.split():
                or_queries = [models.Q(**{construct_search(field_name): bit}) for field_name in self.lookup_opts.admin.search_fields]
                other_qs = QuerySet(self.model)
                other_qs.dup_select_related(qs)
                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                qs = qs & other_qs

        if self.opts.one_to_one_field:
            qs = qs.complex_filter(self.opts.one_to_one_field.rel.limit_choices_to)

        return qs
コード例 #9
0
    def foreignkey_autocomplete(self, request):
        """
        Searches in the fields of the given related model and returns the
        result as a simple string to be used by the jQuery Autocomplete plugin
        """
        query = request.GET.get('q', None)
        app_label = request.GET.get('app_label', None)
        model_name = request.GET.get('model_name', None)
        search_fields = request.GET.get('search_fields', None)
        object_pk = request.GET.get('object_pk', None)
        try:
            to_string_function = self.related_string_functions[model_name]
        except KeyError:
            to_string_function = lambda x: x.__unicode__()
        if search_fields and app_label and model_name and (query or object_pk):

            def construct_search(field_name):
                # use different lookup methods depending on the notation
                if field_name.startswith('^'):
                    return "%s__istartswith" % field_name[1:]
                elif field_name.startswith('='):
                    return "%s__iexact" % field_name[1:]
                elif field_name.startswith('@'):
                    return "%s__search" % field_name[1:]
                else:
                    return "%s__icontains" % field_name

            model = models.get_model(app_label, model_name)
            queryset = model._default_manager.all()
            data = ''
            if query:
                for bit in query.split():
                    or_queries = [
                        models.Q(
                            **{
                                construct_search(smart_str(field_name)):
                                smart_str(bit)
                            }) for field_name in search_fields.split(',')
                    ]
                    other_qs = QuerySet(model)
                    other_qs.dup_select_related(queryset)
                    other_qs = other_qs.filter(reduce(operator.or_,
                                                      or_queries))
                    queryset = queryset & other_qs
                data = ''.join([
                    six.u('%s|%s\n' % (to_string_function(f), f.pk))
                    for f in queryset
                ])
            elif object_pk:
                try:
                    obj = queryset.get(pk=object_pk)
                except:
                    pass
                else:
                    data = to_string_function(obj)
            return HttpResponse(data)
        return HttpResponseNotFound()
コード例 #10
0
ファイル: __init__.py プロジェクト: klpdotorg/KLP-MIS
    def foreignkey_autocomplete(self, request):
        """
        Searches in the fields of the given related model and returns the 
        result as a simple string to be used by the jQuery Autocomplete plugin
        """

        query = request.GET.get('q', None)
        app_label = request.GET.get('app_label', None)
        model_name = request.GET.get('model_name', None)
        search_fields = request.GET.get('search_fields', None)
        object_pk = request.GET.get('object_pk', None)
        try:
            to_string_function = \
                self.related_string_functions[model_name]
        except KeyError:
            to_string_function = lambda x: x.__unicode__()
        if search_fields and app_label and model_name and (query
                or object_pk):

            def construct_search(field_name):

                # use different lookup methods depending on the notation

                if field_name.startswith('^'):
                    return '%s__istartswith' % field_name[1:]
                elif field_name.startswith('='):
                    return '%s__iexact' % field_name[1:]
                elif field_name.startswith('@'):
                    return '%s__search' % field_name[1:]
                else:
                    return '%s__icontains' % field_name

            model = models.get_model(app_label, model_name)
            queryset = model._default_manager.all()
            data = ''
            if query:
                for bit in query.split():
                    or_queries = \
                        [models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)})
                         for field_name in search_fields.split(',')]
                    other_qs = QuerySet(model)
                    other_qs.dup_select_related(queryset)
                    other_qs = other_qs.filter(reduce(operator.or_,
                            or_queries))
                    queryset = queryset & other_qs
                data = ''.join([u'%s|%s\n' % (to_string_function(f),
                               f.pk) for f in queryset])
            elif object_pk:
                try:
                    obj = queryset.get(pk=object_pk)
                except:
                    pass
                else:
                    data = to_string_function(obj)
            return HttpResponse(data)
        return HttpResponseNotFound()
コード例 #11
0
ファイル: admin.py プロジェクト: WPMedia/django-autocomplete
 def foreignkey_autocomplete(self, request):
     
     def _restrict_queryset(queryset, search_fields):
         for bit in search_fields.split(','):
             if bit[0] == '#':
                 key, val = bit[1:].split('=')
                 queryset = queryset.filter(**{key: val})
         return queryset
     
     query = request.GET.get('q', None)
     app_label = request.GET.get('app_label', None)
     model_name = request.GET.get('model_name', None)
     search_fields = request.GET.get('search_fields', None)
     object_pk = request.GET.get('object_pk', None)
     try:
         to_string_function = self.related_string_functions[model_name]
     except KeyError:
         to_string_function = lambda x: x.__unicode__()
     if search_fields and app_label and model_name and (query or object_pk):
         def construct_search(field_name):
             if field_name.startswith('^'):
                 return "%s__istartswith" % field_name[1:]
             elif field_name.startswith('='):
                 return "%s__iexact" % field_name[1:]
             elif field_name.startswith('@'):
                 return "%s__search" % field_name[1:]
             else:
                 return "%s__icontains" % field_name
         
         model = models.get_model(app_label, model_name)
         queryset = model._default_manager.all()
         data = ''
         if query:
             for bit in query.split():
                 or_queries = []
                 for field_name in search_fields.split(','):
                     if field_name[0] == "#":
                         continue
                     or_queries.append(
                         models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)}))
                 other_qs = QuerySet(model)
                 other_qs.dup_select_related(queryset)
                 other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                 queryset = queryset & other_qs
             queryset = _restrict_queryset(queryset, search_fields)
             data = ''.join([u'%s|%s\n' % (
                 to_string_function(f), f.pk) for f in queryset])
         elif object_pk:
             try:
                 obj = queryset.get(pk=object_pk)
             except:
                 pass
             else:
                 data = to_string_function(obj)
         return HttpResponse(data)
     return HttpResponseNotFound()
コード例 #12
0
ファイル: related.py プロジェクト: 7ws/django-grappelli
    def get_searched_queryset(self, qs):
        model = self.model
        term = self.GET["term"]

        for word in term.split():
            search = [models.Q(**{smart_str(item): smart_str(word)}) for item in model.autocomplete_search_fields()]
            search_qs = QuerySet(model)
            search_qs.dup_select_related(qs)
            search_qs = search_qs.filter(reduce(operator.or_, search))
            qs &= search_qs
        return qs
コード例 #13
0
 def foreignkey_autocomplete(self, request):
     """
     Searches in the fields of the given related model and returns the 
     result as a simple string to be used by the jQuery Autocomplete plugin
     """
     query = request.GET.get('q', None)
     app_label = request.GET.get('app_label', None)
     model_name = request.GET.get('model_name', None)
     search_fields = request.GET.get('search_fields', None)
     object_pk = request.GET.get('object_pk', None)
     try:
         to_string_function = self.related_string_functions[model_name]
     except KeyError:
         to_string_function = lambda x: x.__unicode__()
     if search_fields and app_label and model_name and (query or object_pk):
         def construct_search(field_name):
             # use different lookup methods depending on the notation
             if field_name.startswith('^'):
                 return "%s__istartswith" % field_name[1:]
             elif field_name.startswith('='):
                 return "%s__iexact" % field_name[1:]
             elif field_name.startswith('@'):
                 return "%s__search" % field_name[1:]
             else:
                 return "%s__icontains" % field_name
         model = models.get_model(app_label, model_name)
         queryset = model._default_manager.all()
         data = []
         if query:
             for bit in query.split():
                 or_queries = [models.Q(**{construct_search(
                     smart_str(field_name)): smart_str(bit)})
                         for field_name in search_fields.split(',')]
                 other_qs = QuerySet(model)
                 other_qs.dup_select_related(queryset)
                 other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                 queryset = queryset & other_qs
             if len(queryset) > 0:
                 for f in queryset:
                     label = to_string_function(f)
                     thumb = f.get_thumbnail()
                     id = f.pk
                     data.append({'id': id, 'label': label, 'thumb': thumb})
             else:
                 data.append({'id': '', 'label': 'No results found', 'thumb': ''})
         elif object_pk:
             try:
                 obj = queryset.get(pk=object_pk)
             except:
                 pass
             else:
                 data = to_string_function(obj)
         return HttpResponse(simplejson.dumps(data), content_type="application/json")
     return HttpResponseNotFound()
コード例 #14
0
ファイル: __init__.py プロジェクト: rcooke/django-extensions
 def foreignkey_autocomplete(self, request):
     """
     Searches in the fields of the given related model and returns the
     result as a simple string to be used by the jQuery Autocomplete plugin
     """
     query = request.GET.get('q', None)
     app_label = request.GET.get('app_label', None)
     model_name = request.GET.get('model_name', None)
     search_fields = request.GET.get('search_fields', None)
     object_pk = request.GET.get('object_pk', None)
     try:
         to_string_function = self.related_string_functions[model_name]
     except KeyError:
         to_string_function = lambda x: x.__unicode__()
     if search_fields and app_label and model_name and (query or object_pk):
         def construct_search(field_name):
             # use different lookup methods depending on the notation
             if field_name.startswith('^'):
                 return "%s__istartswith" % field_name[1:]
             elif field_name.startswith('='):
                 return "%s__iexact" % field_name[1:]
             elif field_name.startswith('@'):
                 return "%s__search" % field_name[1:]
             else:
                 return "%s__icontains" % field_name
         model = models.get_model(app_label, model_name)
         # as of Django 1.1 there is an Admin Specific record filter:
         # https://docs.djangoproject.com/en/1.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.queryset
         try:
             # See if there is a custom admin queryset:
             queryset = model.queryset(request)
         except:
             # If not, then make our own:
             queryset = model._default_manager.all()
         data = ''
         if query:
             for bit in query.split():
                 or_queries = [models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)}) for field_name in search_fields.split(',')]
                 other_qs = QuerySet(model)
                 other_qs.dup_select_related(queryset)
                 other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                 queryset = queryset & other_qs
             data = ''.join([six.u('%s|%s\n' % (to_string_function(f), f.pk)) for f in queryset])
         elif object_pk:
             try:
                 obj = queryset.get(pk=object_pk)
             except:
                 pass
             else:
                 data = to_string_function(obj)
         return HttpResponse(data)
     return HttpResponseNotFound()
コード例 #15
0
    def get_searched_queryset(self, qs):
        model = self.model
        term = self.GET["term"]

        for word in term.split():
            search = [
                models.Q(**{smart_str(item): smart_str(word)})
                for item in model.autocomplete_search_fields()
            ]
            search_qs = QuerySet(model)
            search_qs.dup_select_related(qs)
            search_qs = search_qs.filter(reduce(operator.or_, search))
            qs &= search_qs
        return qs
コード例 #16
0
ファイル: related.py プロジェクト: az1d0/django-grappelli
    def get_searched_queryset(self, qs):
        model = self.model
        term = self.GET["term"]

        try:
            search_fields = model.autocomplete_search_fields()
        except AttributeError:
            search_fields = AUTOCOMPLETE_SEARCH_FIELDS[model._meta.app_label][model._meta.module_name]
        except KeyError:
            search_fields = ()

        for word in term.split():
            search = [models.Q(**{smart_str(item): smart_str(word)}) for item in search_fields]
            search_qs = QuerySet(model)
            search_qs.dup_select_related(qs)
            search_qs = search_qs.filter(reduce(operator.or_, search))
            qs &= search_qs
        return qs
コード例 #17
0
ファイル: widgets.py プロジェクト: pombredanne/recollection
    def search(self, request):
        query = request.GET.get("q", None)
        id = request.GET.get("id", None)
        app_label = request.GET.get("app_label", None)
        model_name = request.GET.get("model_name", None)
        db_field_name = request.GET.get("db_field_name", None)
        search_fields = self.related_search_fields[db_field_name]

        if search_fields and app_label and model_name and query:

            def construct_search(field_name):
                # use different lookup methods depending on the notation
                if field_name.startswith("^"):
                    return "%s__istartswith" % field_name[1:]
                elif field_name.startswith("="):
                    return "%s__iexact" % field_name[1:]
                elif field_name.startswith("@"):
                    return "%s__search" % field_name[1:]
                else:
                    return "%s__icontains" % field_name

            model = models.get_model(app_label, model_name)
            try:
                if id:

                    qs = model.objects.filter(id=query)
                else:
                    qs = model._default_manager.all()

                    for bit in query.split():
                        or_queries = [
                            models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)})
                            for field_name in search_fields
                        ]
                        other_qs = QuerySet(model)
                        other_qs.dup_select_related(qs)
                        other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                        qs = qs & other_qs
            except:
                qs = ()
            data = "".join([u"%s|%s\n" % (self.to_string_function(db_field_name)(f), f.pk) for f in qs])
            return HttpResponse(data)
        return HttpResponseNotFound()
コード例 #18
0
ファイル: views.py プロジェクト: jpic/jlibs
def search(request):
    query = request.GET.get('q', None)
    app_label = request.GET.get('app_label', None)
    model_name = request.GET.get('model_name', None)

    if app_label and model_name and query:
        def construct_search(field_name):
            # use different lookup methods depending on the notation
            if field_name.startswith('^'):
                return "%s__istartswith" % field_name[1:]
            elif field_name.startswith('='):
                return "%s__iexact" % field_name[1:]
            elif field_name.startswith('@'):
                return "%s__search" % field_name[1:]
            else:
                return "%s__icontains" % field_name

        model = models.get_model(app_label, model_name)

        if not hasattr(model, 'can_search') \
            or not model.can_search(request.user):
            return HttpResponseForbidden()

        if hasattr(model, 'get_search_fields'):
            search_fields = model.get_search_fields()

        qs = model._default_manager.all()

        for bit in query.split():
            or_queries = [models.Q(**{construct_search(
                smart_str(field_name)): smart_str(bit)})
                    for field_name in search_fields.split(',')]
            other_qs = QuerySet(model)
            other_qs.dup_select_related(qs)
            other_qs = other_qs.filter(reduce(operator.or_, or_queries))
            qs = qs & other_qs
        
        data = ''.join([u'%s|%s\n' % (f.__unicode__(), f.pk) for f in qs])
        
        return HttpResponse(data)
    
    return HttpResponseNotFound() 
コード例 #19
0
ファイル: admin.py プロジェクト: goodguy/satchmo
    def search(self, request):
        """
        Searches in the fields of the given related model and returns the
        result as a simple string to be used by the jQuery Autocomplete plugin
        """
        query = request.GET.get("q", None)
        app_label = request.GET.get("app_label", None)
        model_name = request.GET.get("model_name", None)
        search_fields = request.GET.get("search_fields", None)
        try:
            to_string_function = self.related_string_functions[model_name]
        except KeyError:
            to_string_function = lambda x: x.__unicode__()

        if search_fields and app_label and model_name and query:

            def construct_search(field_name):
                # use different lookup methods depending on the notation
                if field_name.startswith("^"):
                    return "%s__istartswith" % field_name[1:]
                elif field_name.startswith("="):
                    return "%s__iexact" % field_name[1:]
                elif field_name.startswith("@"):
                    return "%s__search" % field_name[1:]
                else:
                    return "%s__icontains" % field_name

            model = models.get_model(app_label, model_name)
            qs = model._default_manager.all()
            for bit in query.split():
                or_queries = [
                    models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)})
                    for field_name in search_fields.split(",")
                ]
                other_qs = QuerySet(model)
                other_qs.dup_select_related(qs)
                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                qs = qs & other_qs
            data = "".join([u"%s|%s\n" % (to_string_function(f), f.pk) for f in qs])
            return HttpResponse(data)
        return HttpResponseNotFound()
コード例 #20
0
ファイル: main.py プロジェクト: mrts2/django
    def get_query_set(self):
        qs = self.root_query_set
        lookup_params = self.params.copy() # a dictionary of the query string
        for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR):
            if i in lookup_params:
                del lookup_params[i]
        for key, value in lookup_params.items():
            if not isinstance(key, str):
                # 'key' will be used as a keyword argument later, so Python
                # requires it to be a string.
                del lookup_params[key]
                lookup_params[smart_str(key)] = value

            # if key ends with __in, split parameter into separate values
            if key.endswith('__in'):
                lookup_params[key] = value.split(',')

        # Apply lookup parameters from the query string.
        try:
            qs = qs.filter(**lookup_params)
        # Naked except! Because we don't have any other way of validating "params".
        # They might be invalid if the keyword arguments are incorrect, or if the
        # values are not in the correct type, so we might get FieldError, ValueError,
        # ValicationError, or ? from a custom field that raises yet something else 
        # when handed impossible data.
        except:
            raise IncorrectLookupParameters

        # Use select_related() if one of the list_display options is a field
        # with a relationship.
        if self.list_select_related:
            qs = qs.select_related()
        else:
            for field_name in self.list_display:
                try:
                    f = self.lookup_opts.get_field(field_name)
                except models.FieldDoesNotExist:
                    pass
                else:
                    if isinstance(f.rel, models.ManyToOneRel):
                        qs = qs.select_related()
                        break

        # Set ordering.
        if self.order_field:
            qs = qs.order_by('%s%s' % ((self.order_type == 'desc' and '-' or ''), self.order_field))

        # Apply keyword searches.
        def construct_search(field_name):
            if field_name.startswith('^'):
                return "%s__istartswith" % field_name[1:]
            elif field_name.startswith('='):
                return "%s__iexact" % field_name[1:]
            elif field_name.startswith('@'):
                return "%s__search" % field_name[1:]
            else:
                return "%s__icontains" % field_name

        if self.search_fields and self.query:
            for bit in self.query.split():
                or_queries = [models.Q(**{construct_search(str(field_name)): bit}) for field_name in self.search_fields]
                other_qs = QuerySet(self.model)
                other_qs.dup_select_related(qs)
                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                qs = qs & other_qs
            for field_name in self.search_fields:
                if '__' in field_name:
                    qs = qs.distinct()
                    break

        return qs
コード例 #21
0
ファイル: admin.py プロジェクト: sumanau7/django-autocomplete
    def foreignkey_autocomplete(self, request):
        def _restrict_queryset(queryset, search_fields):
            for bit in search_fields.split(','):
                if bit[0] == '#':
                    key, val = bit[1:].split('=')
                    queryset = queryset.filter(**{key: val})
            return queryset

        query = request.GET.get('q', None)
        app_label = request.GET.get('app_label', None)
        model_name = request.GET.get('model_name', None)
        search_fields = request.GET.get('search_fields', None)
        object_pk = request.GET.get('object_pk', None)
        try:
            to_string_function = self.related_string_functions[model_name]
        except KeyError:
            to_string_function = lambda x: x.__unicode__()
        if search_fields and app_label and model_name and (query or object_pk):

            def construct_search(field_name):
                if field_name.startswith('^'):
                    return "%s__istartswith" % field_name[1:]
                elif field_name.startswith('='):
                    return "%s__iexact" % field_name[1:]
                elif field_name.startswith('@'):
                    return "%s__search" % field_name[1:]
                else:
                    return "%s__icontains" % field_name

            model = models.get_model(app_label, model_name)
            queryset = model._default_manager.all()
            data = ''
            if query:
                for bit in query.split():
                    or_queries = []
                    for field_name in search_fields.split(','):
                        if field_name[0] == "#":
                            continue
                        or_queries.append(
                            models.Q(
                                **{
                                    construct_search(smart_str(field_name)):
                                    smart_str(bit)
                                }))
                    other_qs = QuerySet(model)
                    other_qs.dup_select_related(queryset)
                    other_qs = other_qs.filter(reduce(operator.or_,
                                                      or_queries))
                    queryset = queryset & other_qs
                queryset = _restrict_queryset(queryset, search_fields)
                data = ''.join([
                    u'%s|%s\n' % (to_string_function(f), f.pk)
                    for f in queryset
                ])
            elif object_pk:
                try:
                    obj = queryset.get(pk=object_pk)
                except:
                    pass
                else:
                    data = to_string_function(obj)
            return HttpResponse(data)
        return HttpResponseNotFound()
コード例 #22
0
    def get_query_set(self):
        qs = self.manager.get_query_set()
        lookup_params = self.params.copy()  # a dictionary of the query string
        for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR,
                  IS_POPUP_VAR):
            if i in lookup_params:
                del lookup_params[i]
        for key, value in lookup_params.items():
            if not isinstance(key, str):
                # 'key' will be used as a keyword argument later, so Python
                # requires it to be a string.
                del lookup_params[key]
                lookup_params[smart_str(key)] = value

        # Apply lookup parameters from the query string.
        qs = qs.filter(**lookup_params)

        # Use select_related() if one of the list_display options is a field
        # with a relationship.
        if self.lookup_opts.admin.list_select_related:
            qs = qs.select_related()
        else:
            for field_name in self.lookup_opts.admin.list_display:
                try:
                    f = self.lookup_opts.get_field(field_name)
                except models.FieldDoesNotExist:
                    pass
                else:
                    if isinstance(f.rel, models.ManyToOneRel):
                        qs = qs.select_related()
                        break

        # Set ordering.
        if self.order_field:
            qs = qs.order_by(
                '%s%s' %
                ((self.order_type == 'desc' and '-' or ''), self.order_field))

        # Apply keyword searches.
        def construct_search(field_name):
            if field_name.startswith('^'):
                return "%s__istartswith" % field_name[1:]
            elif field_name.startswith('='):
                return "%s__iexact" % field_name[1:]
            elif field_name.startswith('@'):
                return "%s__search" % field_name[1:]
            else:
                return "%s__icontains" % field_name

        if self.lookup_opts.admin.search_fields and self.query:
            for bit in self.query.split():
                or_queries = [
                    models.Q(**{construct_search(field_name): bit})
                    for field_name in self.lookup_opts.admin.search_fields
                ]
                other_qs = QuerySet(self.model)
                other_qs.dup_select_related(qs)
                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                qs = qs & other_qs

        if self.opts.one_to_one_field:
            qs = qs.complex_filter(
                self.opts.one_to_one_field.rel.limit_choices_to)

        return qs
コード例 #23
0
ファイル: rtgchangelist.py プロジェクト: salvapinyol/metricas
    def get_query_set(self):
        qs = self.root_query_set
        lookup_params = self.params.copy() # a dictionary of the query string
        for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR):
            if i in lookup_params:
                del lookup_params[i]
        for key, value in lookup_params.items():
            if not isinstance(key, str):
                # 'key' will be used as a keyword argument later, so Python
                # requires it to be a string.
                del lookup_params[key]
                lookup_params[smart_str(key)] = value

            # if key ends with __in, split parameter into separate values
            if key.endswith('__in'):
                lookup_params[key] = value.split(',')

        # Apply lookup parameters from the query string.
        try:
            qs = qs.filter(**lookup_params) #IGNORE:W0142
        # Naked except! Because we don't have any other way of validating "params".
        # They might be invalid if the keyword arguments are incorrect, or if the
        # values are not in the correct type, so we might get FieldError, ValueError,
        # ValicationError, or ? from a custom field that raises yet something else 
        # when handed impossible data.
        except:
            raise IncorrectLookupParameters

        # Use select_related() if one of the list_display options is a field
        # with a relationship.
        if self.list_select_related:
            qs = qs.select_related()
        else:
            for field_name in self.list_display:
                try:
                    f = self.lookup_opts.get_field(field_name)
                except models.FieldDoesNotExist:
                    pass
                else:
                    if isinstance(f.rel, models.ManyToOneRel):
                        qs = qs.select_related()
                        break
        # Set ordering.
        if self.order_field:
            qs = qs.order_by('%s%s' % ((self.order_type == 'desc' and '-' or ''), self.order_field))

        # Apply keyword searches.
        def construct_search(field_name):
            if field_name.startswith('^'):
                return "%s__istartswith" % field_name[1:]
            elif field_name.startswith('='):
                return "%s__iexact" % field_name[1:]
            elif field_name.startswith('@'): 
                return "%s__search" % field_name[1:] 
            else:
                return "%s__icontains" % field_name

        # Salva: ñapa para las Macs + Ips. Si pudieramos crear una vista en mysql
        # no seria necesario todo esto
        if self.model == Macip:
            if self.search_fields and self.query: # tenemos busqueda. A saco
                qs=Mac.objects.all() #IGNORE:E1101
                qs = qs.filter(Q(ip__ip__contains=str(self.query))|Q(mac__icontains=str(self.query))|Q(switch__iexact=str(self.query)))\
                .extra(select={'ip': '`rtg_ip`.`ip`',
                               'ultima_modificacion_ip': '`rtg_ip`.`ultima_modificacion`',
                               'dns': '`rtg_ip`.`dns`'})
                # aplicamos los filtros y el ordering
                qs = qs.filter(**lookup_params) #IGNORE:W0142
                if self.order_field:
                    qs = qs.order_by('%s%s' % ((self.order_type == 'desc' and '-' or ''), self.order_field))
                return qs

        if self.search_fields and self.query:
            for bit in self.query.split():
                or_queries = [models.Q(**{construct_search(field_name): bit}) for field_name in self.search_fields] #IGNORE:W0142
                other_qs = QuerySet(self.model)
                other_qs.dup_select_related(qs)
                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                qs = qs & other_qs
            for field_name in self.search_fields:
                if '__' in field_name:
                    qs = qs.distinct()
                    break

        return qs
コード例 #24
0
    def get_query_set(self):
        qs = self.root_query_set
        lookup_params = self.params.copy()  # a dictionary of the query string
        for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR,
                  IS_POPUP_VAR):
            if i in lookup_params:
                del lookup_params[i]
        for key, value in lookup_params.items():
            if not isinstance(key, str):
                # 'key' will be used as a keyword argument later, so Python
                # requires it to be a string.
                del lookup_params[key]
                lookup_params[smart_str(key)] = value

            # if key ends with __in, split parameter into separate values
            if key.endswith('__in'):
                lookup_params[key] = value.split(',')

        # Apply lookup parameters from the query string.
        try:
            qs = qs.filter(**lookup_params)
        # Naked except! Because we don't have any other way of validating "params".
        # They might be invalid if the keyword arguments are incorrect, or if the
        # values are not in the correct type, so we might get FieldError, ValueError,
        # ValicationError, or ? from a custom field that raises yet something else
        # when handed impossible data.
        except:
            raise IncorrectLookupParameters

        # Use select_related() if one of the list_display options is a field
        # with a relationship.
        if isinstance(self.list_select_related, (tuple, list)):
            qs = qs.select_related(*self.list_select_related)
        elif self.list_select_related:
            qs = qs.select_related()
        else:
            fields = []
            for field_name in self.list_display:
                try:
                    f = self.lookup_opts.get_field(field_name)
                except models.FieldDoesNotExist:
                    pass
                else:
                    if isinstance(f.rel, models.ManyToOneRel):
                        fields.append(f.name)
            if fields:
                qs = qs.select_related(*fields)

        # Set ordering.
        if self.order_field:
            qs = qs.order_by(
                '%s%s' %
                ((self.order_type == 'desc' and '-' or ''), self.order_field))

        # Apply keyword searches.
        def construct_search(field_name):
            if field_name.startswith('^'):
                return "%s__istartswith" % field_name[1:]
            elif field_name.startswith('='):
                return "%s__iexact" % field_name[1:]
            elif field_name.startswith('@'):
                return "%s__search" % field_name[1:]
            else:
                return "%s__icontains" % field_name

        if self.search_fields and self.query:
            for bit in self.query.split():
                or_queries = [
                    models.Q(**{construct_search(field_name): bit})
                    for field_name in self.search_fields
                ]
                other_qs = QuerySet(self.model)
                other_qs.dup_select_related(qs)
                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                qs = qs & other_qs
            for field_name in self.search_fields:
                if '__' in field_name:
                    qs = qs.distinct()
                    break

        if self.opts.one_to_one_field:
            qs = qs.complex_filter(
                self.opts.one_to_one_field.rel.limit_choices_to)

        return qs
コード例 #25
0
    def search(self, request):
        """ Searches in the fields of the given related model and returns the
        result as a simple string to be used by the jQuery Autocomplete plugin """
        query         = request.GET.get('q', None)
        app_label     = request.GET.get('app_label', None)
        model_name    = request.GET.get('model_name', None)
        search_fields = request.GET.get('search_fields', None)
        field_name    = request.GET.get('field_name', None)
        related_fields = [field[:-3] for field in request.GET
            if field[-3:] == "_pk" and request.GET[field]]

        # remove all garbage and injections
        from django.template.defaultfilters import slugify
        search_fields = [f for f in search_fields.split(',') if f==slugify(f)]

        if search_fields and app_label and model_name and query:
            def construct_search(field_name):
                # use different lookup methods depending on the notation
                if field_name.startswith('^'):
                    return "%s__istartswith" % field_name[1:]
                elif field_name.startswith('='):
                    return "%s__iexact" % field_name[1:]
                elif field_name.startswith('@'):
                    return "%s__search" % field_name[1:]
                else:
                    return "%s__icontains" % field_name

            model = models.get_model(app_label, model_name)
            qs = self.get_autocomplete_queryset(request, field_name)
            if qs is None:
                qs = model._default_manager.all()
            for bit in query.split():
                or_queries = [models.Q(**{construct_search(
                    smart_str(field_name)): smart_str(bit)})
                        for field_name in search_fields]

                other_qs = QuerySet(model)
                other_qs.dup_select_related(qs)
                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
                qs = qs & other_qs
            # filter out by related ids
            qs = qs.filter(**dict([(str(field), request.GET[field+"_pk"]) for field in related_fields]))
            # sort rows directly containing query be the first
            from django.utils.datastructures import SortedDict

            # we do not was to dig into __ relations here. Only first model fields go for smart sorting.
            smartsorted_fields = []
            for field_name in search_fields:
                # add qualifying table
                try:
                    model._meta.get_field_by_name(field_name)
                except:
                    continue
                smartsorted_fields.append(field_name)

            for field_name in smartsorted_fields:
                full_field_name = model._meta.db_table+"."+field_name
                qs = qs.extra(select=SortedDict([
                    ('_%s_match' % field_name,
                        "CASE WHEN lower("+full_field_name+")=lower(%s) THEN 1 ELSE 0 END"),
                    ('_%s_contains' % field_name,
                    # can not put percents here because of http://code.djangoproject.com/ticket/6400
                        "CASE WHEN "+full_field_name+" LIKE %s THEN 1 ELSE 0 END"),
                    ]), select_params = [query, '%'+query+'%'])
            ordering = [ ['-_%s_match' % field_name, '-_%s_contains' % field_name]
                for field_name in smartsorted_fields]
            # flatten list of sorting options
            ordering = sum(ordering, [])
            qs = qs.order_by(*ordering)
            qs = qs[:25]

            # sometimes we want to present suggestions in a special way
            def ajax_str(obj):
                if hasattr(obj, 'ajax_str') and callable(obj.ajax_str):
                    return obj.ajax_str()
                else:
                    return unicode(obj)

            data = ''.join([u'%s|%s\n' % (ajax_str(f), f.pk) for f in qs])
            return HttpResponse(data, mimetype='text/plain')
        return HttpResponseNotFound()