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)
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}, )
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)
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)
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)
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)