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
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)
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
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)
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 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)
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)
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)
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)
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, )
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)
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
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
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)
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;"> </div>""" return mark_safe(html)
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;"> </div>""" return mark_safe(html)