예제 #1
0
파일: sites.py 프로젝트: mofei2816/keops
 def dispatch_action(self, request):
     from keops.db import get_db
     using = get_db(request)
     model = self.get_model(request.GET['model'])
     admin = model._admin
     action = request.GET['action']
     pk = request.GET.get('pk')
     if action in self._global_actions:
         action = self._global_actions[action]
     else:
         action = admin.get_actions(request)[action]
     queryset = None
     if pk:
         queryset = model.objects.using(using).filter(pk=pk)
     return action(admin, request, queryset)
예제 #2
0
파일: detail.py 프로젝트: mrmuxl/keops
def index(request):
    using = get_db(request)
    view_type = request.GET.get("type", "dialog")
    model = get_model(request.GET)
    field = request.GET.get("field")
    pk = request.GET.get("pk")
    if field:
        field = getattr(model, field)
        related = field.related
        rel_model = related.model
        content = rel_model._admin.render_form(cols=2, exclude=[related.field.name], state="write")
        return render(
            request,
            "keops/forms/detail_dialog.html",
            {"header": capfirst(field.verbose_name or field.name), "content": content},
        )
예제 #3
0
def grid(request):
    # TODO use grid method for specific model admin
    using = get_db(request)
    model = get_model(request.GET)
    pk = request.GET.get('pk')
    query = request.GET.get('query')
    field = request.GET.get('field')  # Check related field
    disp_fields = {}
    if field:
        obj = model.objects.using(using).get(pk=pk)
        queryset = getattr(obj, field)
        field = getattr(model, field)
        model = field.related.model
        fields = field.list_fields
    else:
        queryset = model.objects.using(using)
        if hasattr(model, 'Extra'):
            fields = model.Extra.field_groups.get('list_fields')
            disp_fields = _choice_fields(model)
        else:
            fields = None
        if isinstance(fields, tuple):
            fields = list(fields)
    fields = fields or [f.name for f in model._meta.concrete_fields if not f.primary_key]
    start = int(request.GET.get('start', '0'))
    limit = int(request.GET.get('limit', '50')) + start  # settings
    count = request.GET.get('total', False)

    if query:
        queryset = search_text(queryset, query)

    if count:
        count = queryset.all().count()
    else:
        count = None

    queryset = queryset.all()[start:limit]

    # TODO Check content type permissions permissions

    get_val = lambda x: isinstance(x, datetime.date) and field_text(x) or ('' if x is None else (callable(x) and x()) or x)
    fields = ['pk'] + fields
    display_fn = _display_fn(model)
    rows = [{f: display_fn.get(f, str)(get_val(getattr(row, disp_fields.get(f, f)))) for f in fields} for row in queryset]
    data = {'items': rows, 'total': count}
    return HttpJsonResponse(data)
예제 #4
0
 def dispatch_action(self, request):
     """
     Dispatch the admin action.
     """
     from keops.db import get_db
     using = get_db(request)
     if request.body:
         data = json.loads(request.body.decode(settings.DEFAULT_CHARSET))
         request.POST = data
     else:
         data = request.GET
     model = self.get_model(data['model'])
     admin = model._admin
     pk = request.GET.get('pk')
     action = admin.get_action(data['action'])[0]
     queryset = None
     if pk:
         queryset = model.objects.using(using).filter(pk=pk)
     return action(admin, request, queryset)
예제 #5
0
파일: db.py 프로젝트: mofei2816/keops
def read_items(request):
    from django.db.models.fields.related import ReverseManyRelatedObjectsDescriptor
    using = get_db(request)
    # Force get all items
    context = {'all': None}
    model = get_model(request.GET)
    items = json.loads(request.GET['items'])
    pk = request.GET['pk']
    data = {}
    # Optimize selecting pk field only
    obj = model.objects.using(using).only(model._meta.pk.name).get(pk=pk)
    for item in items:
        field = getattr(model, item)
        if getattr(field, 'list_display', None):
            context['fields'] = field.list_display
        if isinstance(field, ReverseManyRelatedObjectsDescriptor):
            data[item] = [{'id': r.id, 'text': str(r)} for r in getattr(obj, item).all()]
        else:
            context['queryset'] = _get_queryset_fields(model, obj, item)
            data[item] = prepare_read(context, using)
    return HttpJsonResponse(data)
예제 #6
0
파일: actions.py 프로젝트: mofei2816/keops
def delete_selected(modeladmin, request, queryset):
    from keops.db import get_db
    using = get_db(request)
    try:
        n = queryset.count()
        with transaction.atomic(using=using):
            for obj in queryset:
                obj.delete()
                modeladmin.log_deletion(request, obj, force_text(obj))
            modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % {
                "count": n, "items": model_ngettext(modeladmin.opts, n)
            }, messages.SUCCESS)
    except ProtectedError as e:
        modeladmin.message_user(request,
            _('Cannot delete the records because they are referenced through a protected foreign key!') +
            '<br>' + '<br>'.join([capfirst(str(obj.__class__._meta.verbose_name)) + ': ' + str(obj)
                                 for obj in e.protected_objects]), level=messages.ERROR, )
    except models.validators.ValidationError as e:
        modeladmin.message_user(request, '<br>'.join(e.messages), level=messages.ERROR)

    return HttpMessagesResponse(request._messages)