Ejemplo n.º 1
0
def data(request, app_label, model_name=None, pk=None, filter_kwargs=None, exclude_kwargs=None):
    """
        Retrieve data based on the app or the model or just for a single model instance
        It's possible to filter results using the DEFAULT_MANAGER and MODEL_MANAGERS settings
    """
    models= registered_models.get(app_label, None)
    
    if models is None:
        return Http400
    
    if model_name is not None:
        # retrieve the correct model
        models= [ model for model in models if model.__name__.lower() == model_name ]
        
    data= {}
    default_manager_name= settings.DEFAULT_MANAGER
    
    for model in models:
        model_name= model.__name__
        model_id= "%s.%s" % (app_label, model_name,)
        
        # get manager name
        manager_name= settings.MODEL_MANAGERS.get(model_id, default_manager_name)
        manager= getattr(model, manager_name)

        # if the manager is an instance of BrokeManager, allow filtering based on some computation
        # around the request object
        if isinstance(manager, managers.BrokeManager):
            manager = manager.filter_based_on_request(request)

        # retrieve data
        if filter_kwargs is not None:
            manager = manager.filter(**filter_kwargs)
        if exclude_kwargs is not None:
            manager = manager.exclude(**exclude_kwargs)

        if pk is None:
            data_set= manager.all()
        else:
            try:
                data_set= manager.filter(pk=pk)
            except model.DoesNotExist:
                raise http.Http404
                    
        data.setdefault(model_name, encoder.serialize(data_set))

    return http.HttpResponse(json.dumps(data), mimetype="application/json")
Ejemplo n.º 2
0
def _get_meta_data(app_label, model_name=None):
    """
        Retrieve models meta data
    """
    models= registered_models.get(app_label, None)

    if models is None:
        return Http400

    if model_name is not None:
        models= [ model for model in models if model.__name__ == model_name ]

    meta_data= {}

    for model in models:
        _meta_data={}

        for field in model._meta.fields:
            _meta_data.setdefault(field.name, field.__class__.__name__)

        meta_data.setdefault(model.__name__, _meta_data)

    return meta_data