コード例 #1
0
ファイル: views.py プロジェクト: Ximpia/ximpia
def jxSave(request, **args):
    """
    Save register. Operation executed when clicking on "Save" button on forms. Saves all instances related to forms, included
    many to many relationships.

    ** Attributes **

    * ``request``
    * ``**args``
    """
    logger.debug("jxSave...")
    logger.debug(json.dumps(request.REQUEST.items()))
    request.session.set_test_cookie()
    request.session.delete_test_cookie()
    if (request.REQUEST.has_key("action")) and request.is_ajax() == True:
        action = request.REQUEST["action"]
        logger.debug("action: %s" % (action))
        if action == "save":
            # resolve form, set to args['ctx'].form
            logger.debug("jxSave :: form: %s" % (request.REQUEST["form"]))
            formId = request.REQUEST["form"]
            app = request.REQUEST["app"]
            app_path = get_app_full_path(app)
            logger.debug("formId: {} app: {} app_path: {}".format(formId, app, app_path))
            formModule = getattr(getattr(__import__(app_path + ".forms"), app_path.split(".")[1]), "forms")
            logger.debug("formModule: {}".format(formModule))
            classes = dir(formModule)
            resolvedForm = None
            for myClass in classes:
                try:
                    formIdTarget = eval("formModule." + myClass + "._XP_FORM_ID")
                    if formIdTarget == formId:
                        resolvedForm = eval("formModule." + myClass)
                except AttributeError:
                    pass
            logger.debug("jxSave :: resolvedForm: %s" % (resolvedForm))
            # Instantiate form, validate form
            logger.debug("jxSave :: post: %s" % (args["ctx"].post))
            # instantiate form for create and update with db instances dbObjects from form
            # dbObjects : pk, model
            instances = {}
            dbObjects = json.loads(args["ctx"].post["dbObjects"].replace("'", '"'))
            logger.debug("jxSave :: dbObjects: %s" % (dbObjects))
            # TODO: In case we support more masters than 'default', resolve appropiate master db name
            for key in dbObjects:
                # Get instance model by pk
                impl = dbObjects[key]["impl"]
                cls = get_class(impl)
                instances[key] = cls.objects.using("default").get(pk=dbObjects[key]["pk"])
            logger.debug("jxSave :: instances. %s" % (instances))
            if len(instances) == 0:
                args["ctx"].form = resolvedForm(args["ctx"].post, ctx=args["ctx"])
            else:
                args["ctx"].form = resolvedForm(args["ctx"].post, ctx=args["ctx"], instances=instances)
            logger.debug("jxSave :: instantiated form")
            args["ctx"].jsData = JsResultDict()
            isFormValid = args["ctx"].form.is_valid()
            # isFormValid = False
            logger.debug("jxSave :: isFormValid: %s" % (isFormValid))
            obj = CommonService(args["ctx"])
            obj.request = request
            if isFormValid == True:
                logger.debug("jxSave :: Form is valid!!!")
                obj._set_main_form(args["ctx"].form)
                result = obj.save()
            else:
                if settings.DEBUG == True:
                    logger.debug("Validation error!!!!!")
                    logger.debug(args["ctx"].form.errors)
                    if args["ctx"].form.errors.has_key("invalid"):
                        logger.debug(args["ctx"].form.errors["invalid"])
                    traceback.print_exc()
                if args["ctx"].form.errors.has_key("invalid"):
                    errorDict = {"": args["ctx"].form.errors["invalid"][0]}
                    logger.debug("errorDict: %s" % (errorDict))
                    result = obj._buildJSONResult(obj._getErrorResultDict(errorDict, pageError=True))
                else:
                    # Build errordict
                    errorDict = {}
                    for field in args["ctx"].form.errors:
                        if field != "__all__":
                            errorDict[field] = args["ctx"].form.errors[field][0]
                    logger.debug("errorDict: %s" % (errorDict))
                    result = obj._buildJSONResult(obj._getErrorResultDict(errorDict, pageError=False))
                return result
        else:
            logger.debug("Invalid action name. Only save is allowed")
            raise Http404
    else:
        logger.debug("Unvalid business request")
        raise Http404
    return result
コード例 #2
0
ファイル: views.py プロジェクト: Ximpia/ximpia
def jxDataQuery(request, **args):
    """
    Execute data queries for lists with ordering, page and filters.

    ** Attributes **

    * ``request``
    * ``args``

    ** Html Attributes **

    * ``dbClass``:str : Data class name (DAO)
    * ``fields``:list<str> [optional]
    * ``pageStart``:str [optional] [default:1] : Start page number
    * ``pageEnd``:str [optional] : End page number
    * ``orderBy``:tuple<str> [optional]
    * ``method``:str [optional] [default:searchFields]
    * ``args``:dict<str,str> [optional]
    * ``hasOrdering``:bool [optional]
    * ``orderField``:str [optional]

    ** Returns **

    result
    """
    logger.debug("jxDataQuery...")
    logger.debug("jxDataQuery :: args: %s" % (args))
    logger.debug("jxDataQuery :: REQUEST: %s" % (request.REQUEST))
    if not request.REQUEST.has_key("dbClass") or not request.REQUEST.has_key("app"):
        raise XpMsgException(AttributeError, _("app and dbClass must be defined."))
    dbClass = request.REQUEST["dbClass"]
    dbApplication = ApplicationDAO(args["ctx"])
    # logger.debug('jxDataQuery :: app: {}'.format(request.REQUEST['app'], get_app_full_path(request.REQUEST['app'])))
    app = get_app_full_path(request.REQUEST["app"])
    application = dbApplication.get(name=app)
    # app: ximpia_site.web, MyDAO => ximpia_site.web.data.MyDAO
    classPath = app + ".data." + dbClass
    cls = get_class(classPath)
    obj = cls(args["ctx"])  # @UnusedVariable
    obj.request = request
    logger.debug("jxDataQuery :: obj: %s" % (obj))
    # fields
    fields = []
    if request.REQUEST.has_key("fields"):
        fields = json.loads(request.REQUEST["fields"])
    dbArgs = {}
    meta = AttrDict()
    # disablePaging
    dbArgs["disable_paging"] = False
    if request.REQUEST.has_key("disablePaging"):
        dbArgs["disable_paging"] = json.loads(request.REQUEST["disablePaging"])
    if not dbArgs["disable_paging"]:
        if request.REQUEST.has_key("pageStart"):
            dbArgs["page_start"] = int(request.REQUEST["pageStart"])
        else:
            dbArgs["page_start"] = 1
        logger.debug("jxDataQuery :: pageStart: %s" % (dbArgs["page_start"]))
    # pageEnd
    if request.REQUEST.has_key("pageEnd") and not dbArgs["disable_paging"]:
        dbArgs["page_end"] = int(request.REQUEST["pageEnd"])
    # orderBy
    if request.REQUEST.has_key("orderBy"):
        dbArgs["order_by"] = json.loads(request.REQUEST["orderBy"])
    # args
    if request.REQUEST.has_key("args"):
        requestArgs = json.loads(request.REQUEST["args"])
        for requestArg in requestArgs:
            try:
                dbArgs[requestArg] = json.loads(requestArgs[requestArg])
            except ValueError:
                dbArgs[requestArg] = requestArgs[requestArg]
    # numberResults
    if request.REQUEST.has_key("numberResults"):
        dbArgs["number_results"] = int(request.REQUEST["numberResults"])
    else:
        # Get number results from settings
        dbArgs["number_results"] = int(Setting.objects.get(name__name=KSite.SET_NUMBER_RESULTS_LIST).value)
    logger.debug("jxDataQuery :: numberResults: %s" % (dbArgs["number_results"]))

    # hasOrdering
    if request.REQUEST.has_key("hasOrdering") and request.REQUEST["hasOrdering"] == "true":
        if request.REQUEST.has_key("orderField"):
            fields.append(request.REQUEST["orderField"])
        else:
            fields.append("order")
    # hasHeader
    hasHeader = False
    if request.REQUEST.has_key("hasHeader"):
        hasHeader = json.loads(request.REQUEST["hasHeader"])
    logger.debug("jxDataQuery :: hasHeader: %s" % (hasHeader))
    if "id" not in fields and len(fields) != 0:
        fields.insert(0, "id")
    logger.debug("jxDataQuery :: fields: %s" % (fields))
    logger.debug("jxDataQuery :: dbArgs: %s" % (dbArgs))

    """dbArgs['disablePaging'] = False
    dbArgs['pageStart'] = 1
    dbArgs['pageEnd'] = 1
    dbArgs['numberResults'] = 2"""

    if request.REQUEST.has_key("method"):
        dataListTmp = eval("obj." + request.REQUEST["method"])(fields, **dbArgs)
    else:
        dataListTmp = obj.search_fields(fields, **dbArgs)
    # numberPages
    if dbArgs["disable_paging"] is not True:
        dbArgsPages = copy.copy(dbArgs)
        if dbArgsPages.has_key("page_start"):
            del dbArgsPages["page_start"]
        if dbArgsPages.has_key("page_end"):
            del dbArgsPages["page_end"]
        if request.REQUEST.has_key("method"):
            """dataListTmp = eval('obj.' + request.REQUEST['method'])(fields, **dbArgsPages)
            logger.debug('jxDataQuery :: type dataListTmp: %s' % (type(dataListTmp)) )
            meta.numberPages = dataListTmp.count()/numberResults"""
            pass
        else:
            if dbArgsPages.has_key("disable_paging"):
                del dbArgsPages["disable_paging"]
            if dbArgsPages.has_key("number_results"):
                numberResults = dbArgsPages["number_results"]
                del dbArgsPages["number_results"]
            if dbArgsPages.has_key("page_start"):
                del dbArgsPages["page_start"]
            if dbArgsPages.has_key("page_end"):
                del dbArgsPages["page_end"]
            if dbArgsPages.has_key("order_by"):
                del dbArgsPages["order_by"]
            meta.numberPages = int(round(float(obj.model.objects.filter(**dbArgsPages).count()) / float(numberResults)))
    else:
        meta.numberPages = 1

    meta.pageStart = 1
    if dbArgs.has_key("page_start"):
        meta.pageStart = dbArgs["page_start"]
    if dbArgs.has_key("page_end"):
        meta.pageEnd = dbArgs["page_end"]
    else:
        meta.pageEnd = meta.pageStart
    # logger.debug('jxDataQuery :: dataListTmp: %s' % (dataListTmp) )
    dataList = []
    for dbFields in dataListTmp:
        ll = []
        for dbField in dbFields:
            if type(dbField) == datetime.date:
                ll.append(dbField.strftime("%m/%d/%Y"))
            elif type(dbField) == datetime.datetime:
                ll.append(dbField.strftime("%m/%d/%Y %H:%M"))
            elif type(dbField) == datetime.time:
                ll.append(dbField.strftime("%H:%M"))
            else:
                ll.append(dbField)
        dataList.append(ll)
    logger.debug("jxDataQuery :: dataList: %s" % (dataList))
    # headers
    headers = []
    if hasHeader:
        modelFields = obj.model._meta.fields
        logger.debug("jxDataQuery :: modelFields: %s" % (modelFields))
        if len(fields) == 0:
            # get all model fields from table and add to headers
            for modelField in modelFields:
                headers.append(modelField.verbose_name)
        else:
            # Get model fields with max level 3: field__field__field
            for field in fields:
                if field.count("__") == 0:
                    headerField = obj.model._meta.get_field_by_name(field)[0].verbose_name
                    logger.debug("jxDataQuery :: headerField: %s" % (headerField))
                    headers.append(headerField)
                elif field.count("__") == 1:
                    fieldFrom, fieldTo = field.split("__")
                    logger.debug("jxDataQuery :: fieldFrom: %s fieldTo: %s" % (fieldFrom, fieldTo))
                    """relField = obj.model._meta.get_field_by_name(fieldFrom)[0]\
                        .rel.to._meta.get_field_by_name(fieldTo)[0]"""
                    # 03/07/2013 : We get header name from fk verbose name and not linked to verbose name
                    relField = obj.model._meta.get_field_by_name(fieldFrom)[0]
                    if type(relField.verbose_name) == types.UnicodeType:
                        headerField = relField.verbose_name
                    else:
                        headerField = relField.name
                    logger.debug("jxDataQuery :: headerField: %s" % (headerField))
                    headers.append(headerField)
                elif field.count("__") == 2:
                    fieldFrom, fieldTo1, fieldTo2 = field.split("__")
                    logger.debug("jxDataQuery :: fieldFrom: %s fieldTo: %s" % (fieldFrom, fieldTo1, fieldTo2))
                    """relField = obj.model._meta.get_field_by_name(fieldFrom)[0]\
                        .rel.to._meta.get_field_by_name(fieldTo1)[0]\
                        .rel.to._meta.get_field_by_name(fieldTo2)[0]"""
                    # 03/07/2013 : We get header name from fk verbose name and not linked to verbose name
                    relField = obj.model._meta.get_field_by_name(fieldFrom)[0]
                    if type(relField.verbose_name) == types.UnicodeType:
                        headerField = relField.verbose_name
                    else:
                        headerField = relField.name
                    logger.debug("jxDataQuery :: headerField: %s" % (headerField))
                    headers.append(headerField)
    logger.debug("jxDataQuery :: headers: %s" % (headers))
    results = {"headers": headers, "data": dataList, "meta": meta}
    logger.debug("jxDataQuery :: results: %s" % (results))
    return HttpResponse(json.dumps(results))