def compress(self, data_list): # Reimporting models from froms is tricky, and may lead to circular ImportErrors # Hence, importing here locally. from any_urlfield.models.values import AnyUrlValue if data_list: type_prefix = data_list[0] # avoid `id, *values = data_list` notation, that is python 3 syntax. values = data_list[1:] # May happen when deleting models in formsets if type_prefix is None or type_prefix == '': return None urltype = self.url_type_registry[type_prefix] value_index = self.url_type_registry.index(type_prefix) value = values[value_index] if type_prefix == 'http': return AnyUrlValue(type_prefix, value, self.url_type_registry) else: if urltype.has_id_value: if isinstance(value, Model): value = value.pk # Auto cast foreign keys to integer. elif value: value = long(value) else: return None return AnyUrlValue(type_prefix, value, self.url_type_registry) return None
def compress(self, data_list): if data_list: type_prefix = data_list[ 0] # avoid `id, *values = data_list` notation, that is python 3 syntax. values = data_list[1:] # May happen when deleting models in formsets if type_prefix is None or type_prefix == '': return None urltype = self.url_type_registry[type_prefix] value_index = self.url_type_registry.index(type_prefix) value = values[value_index] if type_prefix == 'http': return AnyUrlValue(type_prefix, value, self.url_type_registry) else: if urltype.has_id_value: if isinstance(value, Model): value = value.pk # Auto cast foreign keys to integer. elif value: value = long(value) else: return None return AnyUrlValue(type_prefix, value, self.url_type_registry) return None
def to_python(self, value): if isinstance(value, AnyUrlValue): return value # Convert the string value if value is None: return None return AnyUrlValue.from_db_value(value, self._static_registry)
def resolve_objects(cls, objects, skip_cached_urls=False): """ Make sure all AnyUrlValue objects from a set of objects is resolved in bulk. This avoids making a query per item. :param objects: A list or queryset of models. :param skip_cached_urls: Whether to avoid prefetching data that has it's URL cached. """ # Allow the queryset or list to consist of multiple models. # This supports querysets from django-polymorphic too. queryset = list(objects) any_url_values = [] for obj in queryset: model = obj.__class__ for field in _any_url_fields_by_model[model]: any_url_value = getattr(obj, field) if any_url_value and any_url_value.url_type.has_id_value: any_url_values.append(any_url_value) AnyUrlValue.resolve_values(any_url_values, skip_cached_urls=skip_cached_urls)
def from_db_value(self, value, expression, connection, context): # This method is used to cast DB values to python values. # The call to to_python() is not used anymore. if value is None: return None return AnyUrlValue.from_db_value(value, self._static_registry)
def from_db_value(self, value, expression, connection, context=None): # This method is used to cast DB values to python values. # The call to to_python() is not used anymore. if value is None: return None return AnyUrlValue.from_db_value(value, self._static_registry)