Example #1
0
 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])
Example #2
0
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
Example #3
0
 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])
Example #4
0
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
Example #5
0
    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
Example #6
0
    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
Example #7
0
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
Example #8
0
 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
Example #9
0
 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
Example #10
0
    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)
Example #11
0
    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)
Example #12
0
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
Example #13
0
 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)
Example #14
0
 def get_rendition_model(cls):
     """ Get the Rendition model for this Image model """
     return get_related_model(cls.renditions.related)
Example #15
0
 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)