示例#1
0
def test_user_location_create(
    user: User,
    countries: List[Country],
    cities: List[City],
    client_with_token: Client,
    user_locations: QuerySet,
):
    """Should be able to create a user location."""
    response = client_with_token.post(
        reverse("user-locations-list"),
        {
            "address": "new test address",
            "is_default": True,
            "city": cities[0].pk,
            "country": countries[0].pk
        },
    )
    obj = user_locations.get(user=user, address="new test address")

    assert response.status_code == 201
    assert obj.is_default is True
    assert obj.city == cities[0]
    assert obj.user == user
    assert obj.created_by == user
    assert obj.modified_by == user
示例#2
0
 def get(self, *args, **kwargs):
     """
     Get an object by querying the translations model and returning a 
     combined instance.
     """
     # Enforce a language_code to be used
     newargs, newkwargs = self._translate_args_kwargs(*args, **kwargs)
     # Enforce 'select related' onto 'master'
     # Get the translated instance
     found = False
     qs = self
     
     
     if 'language_code' in newkwargs:
         language_code = newkwargs.pop('language_code')
         qs = self.language(language_code)
         found = True
     elif args:
         language_code = None
         for arg in args:
             if not isinstance(arg, Q):
                 continue
             language_code = self._find_language_code(arg)
             if language_code:
                 break
         if language_code:
             qs = self.language(language_code)
             found = True
     else:
         found = self._scan_for_language_where_node(qs.query.where.children)
     if not found:
         qs = self.language()
     # self.iterator already combines! Isn't that nice?
     return QuerySet.get(qs, *newargs, **newkwargs)
示例#3
0
    def _get_queryset_for_discoverable_child_assets(
            self, request: Request, queryset: QuerySet) -> QuerySet:
        """
        Returns a queryset containing the children of publically discoverable
        assets based on the discoverability of the child's parent. The parent
        uid is passed in the request query string.
        """

        self._return_queryset = False

        parameters = self.__get_parsed_parameters(request)
        try:
            parent_uids = parameters[self.PARENT_UID_PARAMETER]
        except KeyError:
            return queryset

        # `self.__get_parsed_parameters()` returns a list for each parameters
        # but we should only search only with one parent uid
        parent_obj = queryset.get(uid=parent_uids[0])

        if not isinstance(parent_obj, Asset):
            return queryset

        if parent_obj.has_perm(get_anonymous_user(), PERM_DISCOVER_ASSET):
            self._return_queryset = True
            return queryset.filter(pk__in=self._get_publics(),
                                   parent=parent_obj)

        return queryset
示例#4
0
 def get(self, *args, **kwargs):
     """
     Get an object by querying the translations model and returning a 
     combined instance.
     """
     # Enforce a language_code to be used
     newargs, newkwargs = self._translate_args_kwargs(*args, **kwargs)
     # Enforce 'select related' onto 'master'
     # Get the translated instance
     found = False
     qs = self
     
     
     if 'language_code' in newkwargs:
         language_code = newkwargs.pop('language_code')
         qs = self.language(language_code)
         found = True
     elif args:
         language_code = None
         for arg in args:
             if not isinstance(arg, Q):
                 continue
             language_code = self._find_language_code(arg)
             if language_code:
                 break
         if language_code:
             qs = self.language(language_code)
             found = True
     else:
         found = self._scan_for_language_where_node(qs.query.where.children)
     if not found:
         qs = self.language()
     # self.iterator already combines! Isn't that nice?
     return QuerySet.get(qs, *newargs, **newkwargs)
示例#5
0
 def get(self, *args, **kwargs):
     # same as getitem, idk why getitem isn't called when this is used
     result = QuerySet.get(self, *args, **kwargs)
     if isinstance(result, models.Model):
         return result.as_leaf_class()
     else:
         return result
示例#6
0
 def get(self, *args, **kwargs):
     # same as getitem, idk why getitem isn't called when this is used
     result = QuerySet.get(self, *args, **kwargs)
     if isinstance(result, models.Model):
         return result.as_leaf_class()
     else:
         return result
    def render(self, name, value, attrs=None):
        if value is None:
            value = ""

        display = ""
        if self.url:
            url = self.url
            display = self.initial_display

        else:
            dc, dc, query = pickle.loads(_simple_autocomplete_queryset_cache[self.token])
            queryset = QuerySet(model=self.model, query=query)
            threshold = get_threshold_for_model(self.model)
            if threshold and (queryset.count() < threshold):
                # Render the normal select widget if size below threshold
                return super(AutoCompleteWidget, self).render(name, value, attrs)
            else:
                url = reverse("simple-autocomplete", args=[self.token])
                fieldname = get_search_fieldname(self.model)
                if value:
                    display = getattr(queryset.get(pk=value), fieldname)

            html = """
    <script type="text/javascript">
    $(document).ready(function(){

    $("#id_%(name)s_helper").autocomplete({
        source: function(request, response){
            $.ajax({
                url: "%(url)s",
                data: {q: request.term},
                success: function(data) {
                    if (data != 'CACHE_MISS')
                        response($.map(data, function(item) {
                            return {
                                label: item[1],
                                value: item[1],
                                real_value: item[0]
                            };
                        }));
                },
                dataType: "json"
            });
        },
        select: function(event, ui) { $('#id_%(name)s').val(ui.item.real_value); },
        minLength: 3
    });

    });
    </script>

<input id="id_%(name)s_helper" type="text" value="%(display)s" />
<a href="#" title="Clear" onclick="$('#id_%(name)s_helper').val(''); $('#id_%(name)s').val(''); return false;">x<small></small></a>
<input name="%(name)s" id="id_%(name)s" type="hidden" value="%(value)s" />""" % dict(
                name=name, url=url, display=display, value=value
            )
            return mark_safe(html)
示例#8
0
文件: query.py 项目: gvidon/blombum
 def get(self, *args, **kwargs):
     """
     Performs the SELECT and returns a single object matching the given
     keyword arguments.
     """
     if self._cache_clean:
         clone = self.filter(*args, **kwargs)
         if not clone._order_by:
             clone._order_by = ()
         cache.delete(self._get_cache_key())
     else:
         return QuerySet.get(self, *args, **kwargs)
示例#9
0
文件: query.py 项目: ixth/blombum
 def get(self, *args, **kwargs):
     """
     Performs the SELECT and returns a single object matching the given
     keyword arguments.
     """
     if self._cache_clean:
         clone = self.filter(*args, **kwargs)
         if not clone._order_by:
             clone._order_by = ()
         cache.delete(self._get_cache_key())
     else:
         return QuerySet.get(self, *args, **kwargs)
示例#10
0
 def _create_object_from_params(self, lookup, params):
     try:
         with transaction.atomic(using=self.db):
             params = {k: v() if callable(v) else v for k, v in params.items()}
             obj = self.create(**params)
         return obj, True
     except IntegrityError:
         exc_info = sys.exc_info()
         try:
             return QuerySet.get(self, **lookup), False
         except self.model.DoesNotExist:
             pass
         six.reraise(*exc_info)
示例#11
0
def make_session(row: dict, schoolQuery: QuerySet, country: str) -> SchoolV2Session:
    return SchoolV2Session(
        school=schoolQuery.get(
            country=country,
            school_id=row["school_id"],
        ),
        session=row["session"] if "session" in row else "",
        data_year=row["data_year"] if "data_year" in row and row["data_year"] else None,
        total_enrollment=int(float(row["total_enrollment"]))
        if "total_enrollment" in row
        else None,
        test_score=row["test_score"]
        if "test_score" in row and row["test_score"]
        else None,
        gender_ratio=row["gender_ratio"]
        if "gender_ratio" in row and row["gender_ratio"]
        else None,
    )
示例#12
0
def bulk_update(
    request: Request,
    queryset: QuerySet,
    serializer_class: Type[ModelSerializer],
    pk_name: str = 'id',
):
    """Function to add bulk_update endpoint into rest_framework.viewsets.ModelViewSet"""
    request_data = request.data
    if not isinstance(request_data, list):
        err = validation_failed_dict([(2513, None,
                                       "Expected list of dictionaries.")])
        return Response(err, status=http_status.HTTP_400_BAD_REQUEST)
    any_error = False
    serializers = []
    for item_data in request_data:
        if not isinstance(item_data, dict):
            any_error = True
            break
        pk_value = item_data.pop(pk_name, None)
        if pk_value is None:
            any_error = True
            break
        try:
            item = queryset.get(**{pk_name: pk_value})
        except (ObjectDoesNotExist, ValidationError):
            any_error = True
            break
        serializer = serializer_class(item,
                                      data=item_data,
                                      partial=True,
                                      context={'request': request})
        if not serializer.is_valid():
            any_error = True
            break
        serializers.append(serializer)
    if any_error:
        err = validation_failed_dict([(2951, None,
                                       'Error in data for bulk action.')])
        return Response(err, status=http_status.HTTP_400_BAD_REQUEST)
    instances = [serializer.save() for serializer in serializers]
    response_serializer = serializer_class(instances,
                                           many=True,
                                           context={'request': request})
    return Response(response_serializer.data, status=http_status.HTTP_200_OK)
示例#13
0
def test_user_languages_create(
    user: User,
    client_with_token: Client,
    user_languages: QuerySet,
):
    """Should be able to create a user language."""
    response = client_with_token.post(
        reverse("user-languages-list"),
        {
            "language": "en",
            "is_native": False
        },
    )
    lang = user_languages.get(user=user, language="en")
    assert response.status_code == 201
    assert lang.is_native is False
    assert lang.user == user
    assert lang.created_by == user
    assert lang.modified_by == user
示例#14
0
def test_user_contacts_create(
    user: User,
    client_with_token: Client,
    user_contacts: QuerySet,
):
    """Should be able to create a user contact."""
    response = client_with_token.post(
        reverse("user-contacts-list"),
        {
            "value": "test 123456",
            "contact": user_contacts[0].contact.pk
        },
    )
    obj = user_contacts.get(user=user, value="test 123456")

    assert response.status_code == 201
    assert obj.user == user
    assert obj.created_by == user
    assert obj.modified_by == user
示例#15
0
    def get(self, *args, **kwargs):
        """
        Get an object by querying the translations model and returning a 
        combined instance.
        """
        qs = self._clone()
        newargs, newkwargs = qs._translate_args_kwargs(*args, **kwargs)

        if 'language_code' in newkwargs:
            qs.language(newkwargs.pop('language_code'))
            qs._add_language_filter()
        elif any(qs._find_language_code(arg) for arg in args if isinstance(arg, Q)):
            assert not self._related_model_extra_filters, (
                   'Cannot use select_related along with language_code field in Q objects')
            # language code in *args, no related fields, do not call _add_language_filter
        else:
            qs._add_language_filter()

        # self.iterator already combines! Isn't that nice?
        return QuerySet.get(qs, *newargs, **newkwargs)
示例#16
0
文件: filters.py 项目: kimetrica/kpi
    def _get_queryset_for_discoverable_child_assets(
        self, request: Request, queryset: QuerySet
    ) -> QuerySet:
        """
        Returns a queryset containing the children of publically discoverable
        assets based on the discoverability of the child's parent. The parent
        uid is passed in the request query string.

        args:
            request (Request)
            queryset (QuerySet)

        returns:
            QuerySet
        """

        self._return_queryset = False
        PARENT_UID_PARAMETER = 'parent__uid'

        if 'q' not in request.query_params:
            return queryset

        request_query = request.query_params['q']
        parent_uid = re.search(
            f'{PARENT_UID_PARAMETER}:([a-zA-Z0-9]*)', request_query
        )

        if parent_uid is None:
            return queryset

        parent_obj = queryset.get(uid=parent_uid.group(1))

        if not isinstance(parent_obj, Asset):
            return queryset

        if parent_obj.has_perm(get_anonymous_user(), PERM_DISCOVER_ASSET):
            self._return_queryset = True
            return queryset.filter(pk__in=self._get_publics())

        return queryset
    def render(self, name, value, attrs=None):
        if value is None:
            value = []

        display = ''
        if self.url:
            url = self.url
            # todo: Display is not so simple in this case. Needs a lot of work.
            # Will probably have to be a dictionary.
            display = self.initial_display
        else:
            dc, dc, query = pickle.loads(
                _simple_autocomplete_queryset_cache[self.token]
            )
            queryset = QuerySet(model=self.model, query=query)
            threshold = get_threshold_for_model(self.model)
            if threshold and (queryset.count() < threshold):
                # Render the normal select widget if size below threshold
                return super(AutoCompleteMultipleWidget, self).render(
                    name, value, attrs
                )
            else:
                url = reverse('simple-autocomplete', args=[self.token])
                fieldname = get_search_fieldname(self.model)

            html = u"""
    <script type="text/javascript">
    $(document).ready(function(){

    $("#id_%s_helper").autocomplete({
        source: function(request, response){
            $.ajax({
                url: "%s",
                data: {q: request.term},
                success: function(data) {
                    if (data != 'CACHE_MISS')
                    {
                        response($.map(data, function(item) {
                            return {
                                label: item[1],
                                value: item[1],
                                real_value: item[0]
                            };
                        }));
                    }
                },
                dataType: "json"
            });
        },
        select: function(event, ui) {
            var name = '%s';
            var parent = $('#id_' + name).parent();
            var target = $('div.autocomplete-placeholder', parent);
            target.append('<p><input name="' + name + '" value="' + ui.item.real_value + '" ' 
                + 'type="hidden" />' + ui.item.value 
                + ' <a href="#" title="Remove" onclick="$(this).parent().remove(); $('+"'"+'#id_%s_helper'+"'"+').val(' + "''" + '); $('+"'"+'#id_%s_helper'+"'"+').focus(); return false;">x<small></small></a></p>');
        },
        close: function(event, ui) {
            $('#id_%s_helper').val('');
        },
        minLength: 3
    });

    });
    </script>

<input id="id_%s_helper" type="text" value="" />
<input id="id_%s" type="hidden" value="" />
<div class="autocomplete-placeholder">""" % (name, url, name, name, name, name, name, name)

            # Create html for existing values
            for v in value:
                display = unicode(queryset.get(pk=v))
                html += """<p><input name="%s" type="hidden" value="%s" />
%s <a href="#" title="Remove" onclick="$(this).parent().remove(); $('#id_%s_helper').val(''); $('#id_%s_helper').focus(); return false;">x<small></small></a></p>""" % (name, v, display, name, name)

            html += "</div>"

            # Help with green plus icon alignment
            # todo: use css class
            html += """<div style="display: inline-block; width: 104px;">&nbsp;</div>"""

            return mark_safe(html)
示例#18
0
    def handle(self, *args, **options):

        print "Crunching datas:"

        '''
        Reset Campus
        "manage.py reset" has been woefull deprecated, so no:
        call_command('reset', 'campus', verbosity=0, interactive=False)

        Ran into issue with Windows
        The SQL generated from sqlclear always failed (an issue with the names
        of foriegn key constraints).  If the SQL is ran twice, the tables with
        dependencies will be removed first and independent tables removed second

        Future compatibility issues:
        sqlclear and reset both generate sql based on models in the project.
        Sometimes we have to jump back/forth between map versions and the
        models/tablenames between the two are not yet knows.  The sql is now
        generated directly from in information schema
        '''
        for i in range(2):
            sql = self.reset_sql()
            error = self.run_query(sql)
        if error:
            print "Failed to update the db :("
            print type(error)
            print error
            return

        #syncdb
        call_command('syncdb', verbosity=0, interactive=False)

        #south migrate
        if options.get('test') is not True:
            call_command('migrate', verbosity=0, interactive=False)

        # load all the data from fixtures
        path = os.path.join(os.path.dirname(campus.__file__), 'fixtures')
        fixtures = os.listdir(path)
        fixtures.sort()
        for f in fixtures:
            m = re.match(r"(?P<fixture>\w+)\.json", f)
            if m:
                fixture = m.group('fixture')
                if fixture == "groups":
                    continue # skip groups, must run last
                print "  Updating %s ..." % fixture
                call_command('loaddata', fixture, verbosity=0, interactive=False)

        # Groups
        #   for the m2m relation, create all GroupedLocation instances
        #   had to wait until all locations and contenttypes initiated
        print "  Updating groups ..."
        with open(os.path.join(path, 'groups.json'), 'r') as f: txt = f.read()
        groups = json.loads(txt)
        for g in groups[:]:
            locations = g['fields'].pop('locations')
            qs = QuerySet(MapObj)
            mob = qs.get(id=g['pk'])
            mob = mob.__dict__
            mob.pop('_state')
            Group.objects.create(**mob)

            '''
            when / if groups get additional attributes, will have to extend importer here
            for k,v in g['fields']:
                setattr(new, k, v)
            '''
            g['fields']['locations'] = locations

        sys.stdout.write("  Updating content types ")
        create_groupable_locations(verbosity=1)
        sys.stdout.flush()
        print

        # Create/Update DiningLocations from search service
        print '  Updating dining ...'
        DiningLocation.refresh()

        sys.stdout.write("  Updating m2m locations ")
        for g in groups[:]:
            group     = Group.objects.get(id = g['pk'])
            locations = g['fields']['locations']
            count = 0
            for l in locations:
                gl = GroupedLocation.objects.get_by_natural_key(l[0], l[1])
                group.locations.add(gl)

                # too many dots, otherwise
                if count % 3 == 0:
                    sys.stdout.write(".")
                    sys.stdout.flush()
                count = count +1
        print

        print "All done. The map nom'd all the data and is happy."
    def render(self, name, value, attrs=None):
        if value is None:
            value = ''

        display = ''
        if self.url:
            url = self.url
            display = self.initial_display

        else:
            dc, dc, query = pickle.loads(
                _simple_autocomplete_queryset_cache[self.token]
            )
            queryset = QuerySet(model=self.model, query=query)
            threshold = get_threshold_for_model(self.model)
            if threshold and (queryset.count() < threshold):
                # Render the normal select widget if size below threshold
                return super(AutoCompleteWidget, self).render(
                    name, value, attrs
                )
            else:
                url = reverse('simple_autocomplete:simple-autocomplete', args=[self.token])
                if value:
                    display = unicode(queryset.get(pk=value))

        html = u"""
    <script type="text/javascript">
    (function($) {

    $(document).ready(function() {

    $("#id_%(name)s_helper").autocomplete({
        source: function(request, response){
            $.ajax({
                url: "%(url)s",
                data: {q: request.term},
                success: function(data) {
                    if (data != 'CACHE_MISS')
                    {
                        response($.map(data, function(item) {
                            return {
                                label: item[1],
                                value: item[1],
                                real_value: item[0]
                            };
                        }));
                    }
                },
                dataType: "json"
            });
        },
        select: function(event, ui) { $('#id_%(name)s').val(ui.item.real_value); },
        minLength: 3
    });

    });

    })(django.jQuery);
    </script>

<input id="id_%(name)s_helper" type="text" value="%(display)s" />
<a href="#" title="Clear" onclick="django.jQuery('#id_%(name)s_helper').val(''); django.jQuery('#id_%(name)s_helper').focus(); django.jQuery('#id_%(name)s').val(''); return false;">x<small></small></a>
<input name="%(name)s" id="id_%(name)s" type="hidden" value="%(value)s" />""" % dict(name=name, url=url, display=display, value=value)
        return mark_safe(html)
    def render(self, name, value, attrs=None):
        if value is None:
            value = []

        display = ''
        if self.url:
            url = self.url
            # todo: Display is not so simple in this case. Needs a lot of work.
            # Will probably have to be a dictionary.
            display = self.initial_display
        else:
            dc, dc, query = pickle.loads(
                _simple_autocomplete_queryset_cache[self.token]
            )
            queryset = QuerySet(model=self.model, query=query)
            threshold = get_threshold_for_model(self.model)
            if threshold and (queryset.count() < threshold):
                # Render the normal select widget if size below threshold
                return super(AutoCompleteMultipleWidget, self).render(
                    name, value, attrs
                )
            else:
                url = reverse('simple_autocomplete:simple-autocomplete', args=[self.token])

            html = u"""
    <script type="text/javascript">
    (function($) {

    $(document).ready(function() {

    $("#id_%s_helper").autocomplete({
        source: function(request, response) {
            $.ajax({
                url: "%s",
                data: {q: request.term},
                success: function(data) {
                    if (data != 'CACHE_MISS')
                    {
                        response($.map(data, function(item) {
                            return {
                                label: item[1],
                                value: item[1],
                                real_value: item[0]
                            };
                        }));
                    }
                },
                dataType: "json"
            });
        },
        select: function(event, ui) {
            var name = '%s';
            var parent = $('#id_' + name).parent();
            var target = $('div.autocomplete-placeholder', parent);
            target.append('<p><input name="' + name + '" value="' + ui.item.real_value + '" '
                + 'type="hidden" />' + ui.item.value
                + ' <a href="#" title="Remove" onclick="django.jQuery(this).parent().remove(); django.jQuery('+"'"+'#id_%s_helper'+"'"+').val(' + "''" + '); django.jQuery('+"'"+'#id_%s_helper'+"'"+').focus(); return false;">x<small></small></a></p>');
        },
        close: function(event, ui) {
            django.jQuery('#id_%s_helper').val('');
        },
        minLength: 3
    });

    });

    })(django.jQuery);
    </script>

<input id="id_%s_helper" type="text" value="" />
<input id="id_%s" type="hidden" value="" />
<div class="autocomplete-placeholder">""" % (name, url, name, name, name, name, name, name)

            # Create html for existing values
            for v in value:
                if v is None: continue
                display = unicode(queryset.get(pk=v))
                html += """<p><input name="%s" type="hidden" value="%s" />
%s <a href="#" title="Remove" onclick="django.jQuery(this).parent().remove(); django.jQuery('#id_%s_helper').val(''); django.jQuery('#id_%s_helper').focus(); return false;">x<small></small></a></p>""" % (name, v, display, name, name)

            html += "</div>"

            # Help with green plus icon alignment
            # todo: use css class
            html += """<div style="display: inline-block; width: 104px;">&nbsp;</div>"""

            return mark_safe(html)