def get_panel_definitions(cls): # Look for a panels definition in the InlinePanel declaration if cls.panels is not None: return cls.panels # Failing that, get it from the model else: return extract_panel_definitions_from_model_class(get_related_model(cls.related), exclude=[cls.related.field.name])
def get_object_usage(obj): "Returns a queryset of pages that link to a particular object" pages = Page.objects.none() # get all the relation objects for obj relations = type(obj)._meta.get_all_related_objects(include_hidden=True, include_proxy_eq=True) for relation in relations: related_model = get_related_model(relation) # if the relation is between obj and a page, get the page if issubclass(related_model, Page): pages |= Page.objects.filter( id__in=related_model._base_manager.filter( **{ relation.field.name: obj.id }).values_list('id', flat=True)) else: # if the relation is between obj and an object that has a page as a # property, return the page for f in related_model._meta.fields: if isinstance(f, ParentalKey) and issubclass(f.rel.to, Page): pages |= Page.objects.filter( id__in=related_model._base_manager.filter( **{ relation.field.name: obj.id }).values_list(f.attname, flat=True)) return pages
def get_object_usage(obj): "Returns a queryset of pages that link to a particular object" pages = Page.objects.none() # get all the relation objects for obj relations = type(obj)._meta.get_all_related_objects( include_hidden=True, include_proxy_eq=True ) for relation in relations: related_model = get_related_model(relation) # if the relation is between obj and a page, get the page if issubclass(related_model, Page): pages |= Page.objects.filter( id__in=related_model._base_manager.filter(**{ relation.field.name: obj.id }).values_list('id', flat=True) ) else: # if the relation is between obj and an object that has a page as a # property, return the page for f in related_model._meta.fields: if isinstance(f, ParentalKey) and issubclass(f.rel.to, Page): pages |= Page.objects.filter( id__in=related_model._base_manager.filter( **{ relation.field.name: obj.id }).values_list(f.attname, flat=True) ) return pages
def get_child_edit_handler_class(cls): if cls._child_edit_handler_class is None: panels = cls.get_panel_definitions() cls._child_edit_handler_class = MultiFieldPanel( panels, heading=cls.heading).bind_to_model( get_related_model(cls.related)) return cls._child_edit_handler_class
def get_child_edit_handler_class(cls): if cls._child_edit_handler_class is None: panels = cls.get_panel_definitions() cls._child_edit_handler_class = MultiFieldPanel(panels, heading=cls.heading).bind_to_model( get_related_model(cls.related) ) return cls._child_edit_handler_class
def get_api_data(obj, fields): # Find any child relations (pages only) child_relations = {} if isinstance(obj, Page): child_relations = { child_relation.field.rel.related_name: get_related_model(child_relation) for child_relation in get_all_child_relations(type(obj)) } # Loop through fields for field_name in fields: # Check child relations if field_name in child_relations and hasattr( child_relations[field_name], 'api_fields'): yield field_name, [ dict( get_api_data(child_object, child_relations[field_name].api_fields)) for child_object in getattr(obj, field_name).all() ] continue # Check django fields try: field = obj._meta.get_field(field_name) if field.rel and isinstance(field.rel, models.ManyToOneRel): # Foreign key val = field._get_val_from_obj(obj) if val: yield field_name, OrderedDict([ ('id', field._get_val_from_obj(obj)), ('meta', OrderedDict([ ('type', field.rel.to._meta.app_label + '.' + field.rel.to.__name__), ('detail_url', ObjectDetailURL(field.rel.to, val)), ])), ]) else: yield field_name, None else: yield field_name, field._get_val_from_obj(obj) continue except models.fields.FieldDoesNotExist: pass # Check attributes if hasattr(obj, field_name): value = getattr(obj, field_name) yield field_name, force_text(value, strings_only=True) continue
def get_chosen_item(self): field = self.instance._meta.get_field(self.field_name) related_model = get_related_model(field.related) try: return getattr(self.instance, self.field_name) except related_model.DoesNotExist: # if the ForeignKey is null=False, Django decides to raise # a DoesNotExist exception here, rather than returning None # like every other unpopulated field type. Yay consistency! return None
def build_relational_field(self, field_name, relation_info): # Find all relation fields that point to child class and make them use # the ChildRelationField class. if relation_info.to_many: model = getattr(self.Meta, 'model') child_relations = { child_relation.field.rel.related_name: get_related_model(child_relation) for child_relation in get_all_child_relations(model) } if field_name in child_relations and hasattr(child_relations[field_name], 'api_fields'): return ChildRelationField, {'child_fields': child_relations[field_name].api_fields} return super(BaseSerializer, self).build_relational_field(field_name, relation_info)
def get_api_data(obj, fields): # Find any child relations (pages only) child_relations = {} if isinstance(obj, Page): child_relations = { child_relation.field.rel.related_name: get_related_model(child_relation) for child_relation in get_all_child_relations(type(obj)) } # Loop through fields for field_name in fields: # Check child relations if field_name in child_relations and hasattr(child_relations[field_name], 'api_fields'): yield field_name, [ dict(get_api_data(child_object, child_relations[field_name].api_fields)) for child_object in getattr(obj, field_name).all() ] continue # Check django fields try: field = obj._meta.get_field(field_name) if field.rel and isinstance(field.rel, models.ManyToOneRel): # Foreign key val = field._get_val_from_obj(obj) if val: yield field_name, OrderedDict([ ('id', field._get_val_from_obj(obj)), ('meta', OrderedDict([ ('type', field.rel.to._meta.app_label + '.' + field.rel.to.__name__), ('detail_url', ObjectDetailURL(field.rel.to, val)), ])), ]) else: yield field_name, None else: yield field_name, field._get_val_from_obj(obj) continue except models.fields.FieldDoesNotExist: pass # Check attributes if hasattr(obj, field_name): value = getattr(obj, field_name) yield field_name, force_text(value, strings_only=True) continue
def get_rendition_model(cls): """ Get the Rendition model for this Image model """ if django.VERSION >= (1, 9): return get_related_model(cls.renditions.rel) else: return get_related_model(cls.renditions.related)
def get_rendition_model(cls): """ Get the Rendition model for this Image model """ return get_related_model(cls.renditions.related)