Esempio n. 1
0
    def save(self, context, using):
        """
        Save context data on using specified database.
        """
        from keops.views import db
        from keops.db import models
        from django.db.models import ForeignKey
        pk = context.get('pk')
        if 'model' in context:
            model = context['model']
            if isinstance(model, str):
                model = db.get_model(context)
        else:
            model = self.model
        data = context.get('data')
        obj = None
        related = OrderedDict()
        if pk:
            obj = model.objects.using(using).get(pk=pk)
        if data:
            if isinstance(data, str):
                data = json.loads(data)
            obj = obj or model()
            for k, v in data.items():
                try:
                    field = model._admin.get_modelfield(k)
                    if isinstance(field, models.DateField):
                        for format in settings.DATE_INPUT_FORMATS:  # TODO adjust on input widget
                            try:
                                v = datetime.datetime.strptime(v, format)
                                break
                            except:
                                pass
                    elif isinstance(field, ForeignKey):
                        k = field.attname
                    elif isinstance(field, models.OneToManyField):
                        related[field] = v
                        continue
                except:
                    raise
                setattr(obj, k, v)

            obj.full_clean()
            obj.save(using=using)

        # submit related data
        for field, v in related.items():
            self._save_related(field, v, obj, using)
        return True, obj
Esempio n. 2
0
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},
        )