Exemple #1
0
def filterdata_by_user(query_set, user):
    model = query_set.model
    lname = "limit_%s_to" % model.__name__.lower()
    if hasattr(model, lname):  #特殊的地方就直接用自定义的方法(定义的模型中),否则走通用的
        return getattr(model(), lname)(query_set, user)
    from mysite.iclock.iutils import userDeptList, userAreaList

    Department = GetModel("personnel", "Department")
    Area = GetModel("personnel", "Area")
    Device = GetModel("iclock", "Device")

    if model == Area:  #区域表直接过滤
        areaids = userAreaList(user)
        if not areaids:
            return query_set
        areaids = [area.pk for area in areaids]
        return query_set.filter(pk__in=areaids)
    if model == Device:  #如果设备表就直接根据区域控制行权限
        areaids = userAreaList(user)
        if not areaids:
            return query_set
        areaids = [area.pk for area in areaids]
        q = {"area__in": areaids}
        return query_set.filter(Q(**q))

    q = {}
    #以设备为外键的模型按照区域过滤(通用)
    for f in model._meta.fields:
        if isinstance(f, models.fields.related.ForeignKey):
            if f.rel.to.__name__ == "Device":
                areaids = userAreaList(user)
                if areaids:
                    q = {f.name + "__area__in": areaids}
                    return query_set.filter(Q(**q))
                else:
                    return query_set

    deptids = userDeptList(user)  # 获取授权的部门

    if not deptids:
        return query_set
    deptids = [int(dept.pk) for dept in deptids]
    if model == Department:  #部门表直接过滤
        return query_set.filter(pk__in=deptids)
    for f in model._meta.fields:  # 遍历每一个字段
        if isinstance(f, models.fields.related.ForeignKey):
            if f.rel.to.__name__ == "Department":  #以部门为外键的部门过滤
                q = {f.name + "__in": deptids}
                return query_set.filter(Q(**q))
            elif f.rel.to.__name__ == "Employee":
                q = {
                    f.name + "__DeptID__in": deptids
                }  #以部门为外键的人员过滤(如Employee中通过DeptID过滤)
                q = {f.name + "__DeptID__in": deptids}
                query_set.exclude()
                return query_set.filter(Q(**q))


#            return query_set.filter(Q(**q))
    return query_set
Exemple #2
0
def get_form_(request,app_label, model_name, op_name):
    '''
    根据 op_name 得到 表单视图 2
    '''
    ############## 根据 HTTP_REFERER 来判断是否是 从worktable页链接而 ######################
    is_worktable=""
    if request.META.has_key('HTTP_REFERER'):    #---Referer:从哪个页面链接过来的
        is_worktable=request.META['HTTP_REFERER']    
    if is_worktable.find("worktable")!=-1:
        is_worktable=True
    else:
        is_worktable=False
    ############## 得到操作的模型, 及ModelOperation 对象 op_name###############    
    model=GetModel(app_label, model_name)
    if not model: return NoFound404Response(request)
    if not hasattr(model, op_name): return NoFound404Response(request)
    op=getattr(model, op_name)
    if not (type(op)==types.TypeType and issubclass(op, ModelOperation)):
            return NoFound404Response(request)
    ############## 当前用户操作权限的判断###############    
    if op_name.startswith("_"):
        opn= op_name[1:]
    else:
        opn=op_name
    if model.__name__=="Group":
        opn="groupdel"        
    if not data_utils.hasPerm(request.user, model, opn.lower()):
        return HttpResponse("session_fail_or_no_permission")
    ############## 操作表单提交的处理和生成操作页的处理###############
    if request.method=='POST':
        if issubclass(model,Model) and not issubclass(model,CachingModel):
            keys=request.REQUEST.getlist("K")
            ret=[]
            objs=model.objects.filter(pk__in=keys)
            try:
                op_class=op
                for obj in objs:
                    if len(op_class.params)==0:
                        op=op_class(obj)
                        ret.append("%s"%(op.action(**{}) or ""))
                        msg=u"%s(%s) %s"%(op.verbose_name, "", ret or "")
                        LogEntry.objects.log_action_other(request.user.pk,  obj , msg)
            except Exception, e:
                  ret.append(u"%s"%e)
            if not "".join(ret):
                return HttpResponse('{ Info:"OK" }')
            else:
                return HttpResponse('<ul class="errorlist"><li>%s </li></ul>'%("".join(ret)))
        else:
            try:
                ret=model.model_do_action(op_name, request, form_field=form_field)  #-----------------关键点
                if not ret: return HttpResponse('{ Info:"OK" }')    # 操作处理结束 返回结果到前端
                if isinstance(ret, HttpResponse): return ret
                if isinstance(ret, forms.Form):
                    f=ret
                else:
                    return HttpResponse(u"{ errorCode:-1,\nerrorInfo:\"%s\" }"%ret)
            except Exception, e:
                return HttpResponse(u"{ errorCode:-1,\nerrorInfo:\"%s\" }"%e)
Exemple #3
0
def DataNew(request, app_label, model_name):
    '''
    通用添加视图入口
    '''
    from admin_detail_view import retUserForm, adminForm, doPostAdmin, doCreateAdmin
    try:
        dataModel = GetModel(app_label, model_name)
        lock = request.GET.get("_lock", None)
        read_only = lock == 'ALL'
        if not hasPerm(request.user, dataModel, "add"):
            return NoPermissionResponse()
        if not dataModel: return NoFound404Response(request)
        if request.method == "POST" and not read_only:
            return DataNewPost(request, dataModel)

        instance, fields = new_object(dataModel, request.GET)
        if dataModel == User:
            return retUserForm(request, adminForm(request), isAdd=True)
        dataForm = form_for_instance(instance,
                                     lock_fields=lock and fields or [],
                                     read_only=read_only)
        return DataDetailResponse(request, dataModel, dataForm, None,
                                  instance)  #------------------------转向其他处理
    except:
        import traceback
        traceback.print_exc()
Exemple #4
0
def get_search_from(request, app_label, model_name):
    from dbapp.data_edit import form_for_model
    data_model = GetModel(app_label, model_name)
    if not data_model: return NoFound404Response(request)
    searchform = ""
    if hasattr(data_model.Admin, "list_filter"):
        searchform = form_for_model(data_model,
                                    fields=list(data_model.Admin.list_filter))
    if searchform:
        has_header = True
    else:
        has_header = False
    t = loader.get_template("worktable_search_form.html")
    obj_dict = {
        'app_label': app_label,
        'model_name': model_name,
        'has_header': has_header,
        'searchform': searchform,
        'query':
        "&".join([k + "=" + v[0] for k, v in dict(request.GET).items()])
    }
    if model_name == "Device":
        obj_dict[
            "disable_cols"] = "acpanel_type__com_port__com_address__show_enabled|boolean_icon"
    rc = RequestContext(request, obj_dict)
    return HttpResponse(t.render(rc))
def show_export(request,app_label,model_name):
    '''
    导出界面视图
    '''
    models={}
    filetype={}
    template={}
    #models["Employee"]=_("Employee Table")
    #models["Department"]=_("Department Table")
    rn=request.REQUEST.get("reportname",'')    
    if app_label!="list":    
        models[model_name]=rn and rn or GetModel(app_label,model_name)._meta.verbose_name
    else:
        models[model_name]=rn and rn or model_name
    filetype["txt"]=_(u"TXT 文件")
    filetype["csv"]=_(u"CSV 文件")
    filetype["pdf"]=_(u"PDF 文件")
    filetype["xls"] = _(u"EXCEL 文件")
    #filetype["json"]=_("JSON File")
    template["stdemployee"]=_(u"标准的员工模板")
    template["smpemployee"]=_(u"简单的雇员的模板")
    template["stddepartment"]=_(u"指纹模板")
    template["standard"]=_(u"标准模板")
    tables={'Employee':_(u'人员'),'department':_(u'授权部门')}

    return render_to_response('export.html', {
            'models': models,
            'filetype': filetype,
            'template': template,
            'filecoding':filecoding,
            'model_name':model_name,
            })
Exemple #6
0
def funGetModelData(request, app_lable, model_name):
    from mysite.personnel.models.model_emp import format_pin
    model = GetModel(app_lable, model_name)
    fields = request.REQUEST.get("fields", "")
    userid = request.REQUEST.get("userid", "")
    orgdept = request.REQUEST.get("orgdept", "")
    para = dict(request.REQUEST)
    where = {}
    for p in para:

        if p.find("__") > 0:
            t = p.split("__")

            if p.find("__range") > 0:
                where[str(p)] = eval(para[p])
            elif p.find("__in") > 0:
                where[str(p)] = para[p].split(",")
            else:
                where[str(p)] = para[p].decode("utf-8")

    #print where
    #print model
    if fields:
        fields = fields.split(",")
    if model:
        if userid:
            data = model.objects.filter(id__in=userid)
        else:
            data = model.objects.all()
        if where:
            data = model.objects.filter(Q(**where))
        #print data
        if fields:
            data = data.values_list(*fields)
        #print data
        xdata = []
        i = 0
        while i < len(data):
            tmpdata = data[i]
            j = 0
            ndata = []
            while j < len(tmpdata):
                #print type(tmpdata[j])
                if type(tmpdata[j]) == datetime.time:
                    #print "1"
                    ndata.append(tmpdata[j].strftime("%H:%M:%S"))
                elif type(tmpdata[j]) == datetime.date:
                    ndata.append(tmpdata[j].strftime("%Y-%m-%d"))
                else:
                    ndata.append(tmpdata[j])
                j += 1
            xdata.append(ndata)
            i += 1
        #print xdata
        if orgdept:
            xdata = processdept(xdata)
        return getJSResponse(smart_str(dumps(xdata)))
    else:
        return NoFound404Response(request)
Exemple #7
0
def DataDetail(request, app_label, model_name, DataKey):
    '''
    通用编辑视图入口
    '''
    from admin_detail_view import retUserForm, adminForm, doPostAdmin, doCreateAdmin
    dataModel = GetModel(app_label, model_name)
    if not dataModel: return NoFound404Response(request)
    lock = request.GET.get("_lock", None)
    read_only = (lock == 'ALL')
    if not read_only:
        try:
            if dataModel.Admin.read_only: read_only = True
        except:
            pass
    perm = hasPerm(request.user, dataModel, "change")
    if not perm and not read_only:
        if not hasPerm(request.user, dataModel, "browse"):
            return NoPermissionResponse()
        read_only = True
    master = get_model_master(dataModel)
    if dataModel == User:  ######### 用户编辑的处理 ##########
        if request.method == "POST" and not read_only:
            if not perm: return NoPermissionResponse()
            return doPostAdmin(request, dataModel, DataKey)
        else:
            return doCreateAdmin(request, dataModel, DataKey)

    if master:
        try:
            m_instance = master.rel.to.objects.get(pk=DataKey)
        except ObjectDoesNotExist:
            return NoFound404Response(request)
        try:
            instance = dataModel.objects.get(**{master.name: m_instance})
        except ObjectDoesNotExist:
            instance = dataModel(**{master.name: m_instance})
    else:
        try:
            instance = dataModel.objects.get(pk=DataKey)
        except ObjectDoesNotExist:
            return NoFound404Response(request)

    if request.method == "POST" and not read_only:
        if not perm: return NoPermissionResponse()
        return DataChangePost(request, dataModel,
                              form_for_instance(instance, post=request.POST),
                              instance)
    if lock:
        fields = [
            field.find("__") and field.split("__")[0] or field
            for field in dict(request.GET)
        ]
    return DataDetailResponse(
        request, dataModel,
        form_for_instance(instance,
                          lock_fields=master and [master.name]
                          or (lock and fields or []),
                          read_only=read_only), instance.pk, instance)
def get_view(request, app_label, model_name,view_name):
        model=GetModel(app_label, model_name)
        op=threadlocals.get_current_user()

        obj=ViewModel.objects.filter(model__exact=ContentType.objects.get_for_model(model),name__exact=view_name,create_operator__exact=op.username)
        ret=""
        if len(obj)>0:                
                ret=eval(obj[0].info)
                ret["viewtype"]=obj[0].viewtype
                ret=simplejson.dumps(ret)
        return getJSResponse(ret)
def show_import(request,app_label,model_name):
    #tables={'Employee':_(u'人员表'),'department':_(u'部门表')}
    model=GetModel(app_label,model_name)
    tables={model._meta.module_name:model._meta.verbose_name}
    #tables[model_name]=model_name;
    #t=loader.get_template("import.html")
    #return HttpResponse(t.render(RequestContext(request,{
   #                    'tables':tables
   #                    }))
    from django.utils.translation.trans_real import get_language_from_request
    lang_code=get_language_from_request(request)
    return render_to_response('import.html', {'tables': tables,"lang_code":lang_code})
 def action(self):
     import time
     from base.model_utils import GetModel
     models_list = self.request.POST.getlist("KK")
     count = 0
     for elem in models_list:
         count = count + 1
         print 'count: %s' % count
         split_models = elem.split("__")
         flag = True
         for i in split_models:
             app_label, model_name = i.split(".")
             model = GetModel(app_label, model_name)
             if model:
                 if hasattr(model, "clear"):
                     try:
                         model.clear()
                         time.sleep(0.1)
                     except:
                         flag = False
                         import traceback
                         traceback.print_exc()
                         pass
                 else:
                     for obj in model.objects.all():
                         try:
                             obj.delete()
                             time.sleep(0.1)
                         except:
                             flag = False
                             import traceback
                             traceback.print_exc()
                             pass
             else:
                 flag = False
         if flag:
             print split_models, 'ok\n'
         else:
             print split_models, 'fail\n'
Exemple #11
0
def delete_view(request, app_label, model_name,view_name):
        try:
                        
                model=GetModel(app_label, model_name)
                op=threadlocals.get_current_user()
                
                ret=ViewModel.objects.filter(model__exact=ContentType.objects.get_for_model(model),name__exact=view_name,create_operator__exact=op.username)
                if len(ret)<=0:
                        return HttpResponse("View not found or You are not the view's creator !")
                ret.delete()
        except:
                return HttpResponse("delete fail !")
        return HttpResponse("delete Ok !")
Exemple #12
0
def get_chioce_data_widget(request, app_label, model_name):
    '''
    对象选择部件ajax返回
    '''
    from widgets import form_field, check_limit
    import sys
    model = GetModel(app_label, model_name)
    multiple = request.GET.get('multiple', False)  #---是否多选
    depttree = request.GET.get('depttree', False)  #---是否为选择部门
    c = sys.modules['mysite.personnel.models.depttree']
    if depttree:
        dept_treeview = getattr(c, 'dept_treeview')
        return HttpResponse(dept_treeview())
    field = None
    m = sys.modules[model.__module__]
    for p in dir(m):
        try:
            mp = getattr(m, p)
            if issubclass(mp, models.ForeignKey) and not multiple:
                field = mp()
                break
            elif issubclass(mp, models.ManyToManyField) and multiple:
                field = mp(model)
                break
        except:
            pass
    if field is None:
        if multiple:
            field = models.ManyToManyField(model)
        else:
            field = models.ForeignKey(model)

    w_name = request.GET.get('name', '%s' % model.__name__)
    qs, cl = QueryData(request, model)

    ZDeptMultiChoiceDropDownWidget = getattr(c,
                                             'ZDeptMultiChoiceDropDownWidget')
    ZDeptChoiceFlatWidget = getattr(c, 'ZDeptChoiceFlatWidget')

    flat = request.GET.get('flat', "True")
    wg = request.GET.get('widget', False)
    if (model.__name__ == "Department" or model.__name__ == "Area"
        ) and multiple and flat == "False":  #---------------------改点
        f = form_field(field, widget=ZDeptMultiChoiceDropDownWidget)
    elif wg:
        f = form_field(field, widget=locals()[wg])
    else:
        f = form_field(field)
    html = f.widget.render(w_name, model.objects.none())
    return HttpResponse(html)
Exemple #13
0
 def action(self):
     import time
     from base.model_utils import GetModel
     models_list=self.request.POST.getlist("KK")
     count=0
     for elem in models_list:
         count=count+1
         print 'count: %s'%count
         split_models=elem.split("__")
         flag=True
         for i in split_models:
             app_label,model_name=i.split(".")
             model=GetModel(app_label,model_name)
             if model:
                 if hasattr(model,"clear"):
                     try:
                         model.clear()
                         time.sleep(0.1)
                     except:
                         flag=False
                         import traceback; traceback.print_exc()
                         pass
                 else:
                     for obj in model.objects.all():
                         try:
                             obj.delete()
                             time.sleep(0.1)
                         except:
                             flag=False
                             import traceback; traceback.print_exc()
                             pass
             else:
                 flag=False
         if flag:
             print split_models,'ok\n'
         else:
             print split_models,'fail\n'
def retUserForm(request, f, isAdd=False):
    '''
        用户编辑视图的最终生成
        '''
    from urls import dbapp_url
    request.dbapp_url = dbapp_url
    d = []
    dd = []
    c = ""
    try:
        if f.depts:
            for t in f.depts:
                d.append(int(t.id))
                c += t.name + ','
        if f.areas:
            for t in f.areas:
                dd.append(int(t.id))
        cc = {"deptIDs": d, "deptTitle": c[:-1], "areaIDs": dd}
        dataModel = GetModel('auth', 'User')
        inputFields, dtFields = ModifyFields(dataModel)
        inputFields = inputFields + ',AuthedDept' + ',Password' + ',ResetPassword,' + 'fgidnum'
    except:
        import traceback
        traceback.print_exc()
    if hasattr(dataModel.Admin, "help_text"):
        f.admin_help_text = dataModel.Admin.help_text

    kargs = {
        "form": f,
        "dbapp_url": dbapp_url,
        "inputFields": inputFields,
        "dtFields": dtFields,
        "isAdd": isAdd,
        "add": isAdd,
        "dataOpt": User._meta,
        "model_name": User.__name__,
        "request": request
    }
    kargs["title"] = (u"%s" % User._meta.verbose_name).capitalize()
    kargs["app_menu"] = hasattr(
        User.Admin, "app_menu") and User.Admin.app_menu or User._meta.app_label
    return render_to_response(
        [User.__name__ + '_edit.html', 'data_edit.html'],
        cc,
        RequestContext(
            request,
            kargs,
        ),
    )
Exemple #15
0
def user_perms(app_label_model_name):
    from django.contrib.contenttypes.models import ContentType
    from django.contrib.auth.models import Permission
    from base.model_utils import GetModel
    from base.middleware import threadlocals
    user = threadlocals.get_current_user()
    split = app_label_model_name.split(".")
    m = GetModel(split[0], split[1])
    ct = ContentType.objects.get_for_model(m)
    perms = [
        p.codename for p in Permission.objects.filter(content_type=ct)
        if user.has_perm(split[0] + "." + p.codename)
    ]
    perms = sorted(perms)
    return ".".join(perms)
Exemple #16
0
def checkno(request,app_label,model_name):
        from dbapp.data_utils import QueryData
        from base.model_utils import GetModel        
        from mysite.personnel.models.model_emp import format_pin
        obj=GetModel(app_label, model_name)
        data=dict(request.REQUEST.items())
        if 'PIN__exact' in data.keys():
            data['PIN__exact']=format_pin(str(data['PIN__exact']))
        d={}
        for k,v in data.items():
            d[str(k)]=v
        qs=obj.all_objects.filter(**d)
        if qs.count()>0:
                return HttpResponse("&times; " + u"%s"%_(u"已存在"));
        else:
                return HttpResponse("&radic; " + u"%s"%_(u"可使用"));
Exemple #17
0
def DataList(request, app_label, model_name):
    '''
    通用列表视图入口
    '''
    from base.model_utils import get_AppOperation
    AppOperation = get_AppOperation(app_label,model_name)
    if AppOperation:
        try: 
            return AppOperation.view.im_func(request)
        except:
            pass
    dataModel=GetModel(app_label, model_name)   # 模型存在的判断
    if not dataModel: return NoFound404Response(request)
    try:
        return model_data_list(request, dataModel)
    except:
        print_exc()
        raise
def file_export(request,app_label,model_name):       
    
    exportpath=settings.ADDITION_FILE_ROOT+"/"
    #print exportpath
    filename=""
    filetype=""
    model=""
    templatename=""
    filecode=""
    viewname=""
    
    data=dict(request.POST)
    filetype=str(data["filetype"][0])
    model=str(data["model"][0])
    templatename=data["templatename"][0].decode("utf-8")
    filecode=str(data["filecode"][0])
    viewname=str(data["txtviewname"][0])
    op=threadlocals.get_current_user()
   
    dtstr=""
    dt=datetime.now()
   
    dtstr=str(dt.year)+str(dt.month)+str(dt.day)+str(dt.hour)+str(dt.minute)+str(dt.second)
    
    Displayfileds=""                                #导出字段列表,可从视图中提取,或定制
    data=[]
    tblname=""
    model=GetModel(app_label,model_name)
    if viewname:
        from viewmodels import get_view_byname_js
        Displayfileds =get_view_byname_js[viewname]["fields"]
        
        
    if filetype=='txt':
        try:
            if templatename=='stdemployee':
                tblname="emp"
                Displayfileds=["id","EName","Gender","DeptID"]
                data=Employee.objects.all().values_list(*Displayfileds).order_by("id")

            elif templatename=='smpemployee':
                Displayfileds=["id","EName","Gender","DeptID"]
                data=Employee.objects.all().values_list(*Displayfileds).order_by("id")
                tblname="emp"
            elif templatename=='stddepartment': 
                Displayfileds=["DeptID","DeptCode","DeptName","parent"]
                data=Department.objects.all().values_list(*Displayfileds).order_by("DeptID")
                tblname="dep"
            else:
                Displayfileds=[fl.name for fl in model._meta.fields]
                data=model.objects.all().values_list(*Displayfileds).order_by("id")
                tblname=model.__name__
            #print "%s"%data
            filename=op.username+dtstr+tblname+"."+filetype

            ret= render_to_string(templatename+".txt", {
                    'fields': Displayfileds,
                    'tdata': data,
                    })
            f=file(exportpath+filename,'w')
            f.write(ret.encode(filecode))
            f.close()
            #print ret
            response = HttpResponse(ret,mimetype='application/octet-stream')   
            response['Content-Disposition'] = 'attachment; filename=%s' % filename  
            return response  
            
            
#           return HttpResponseRedirect("/data/file/%s"%filename)
            
            
#            response = HttpResponse(mimetype='text/csv')
#            response['Content-Disposition'] = 'attachment; filename=%s' % filename
#            
#            t = loader.get_template(templatename+".txt")
#            c = Context({
#                'tdata': data,
#                'fields': Displayfileds,
#            })
#            response.write(t.render(c))
#            return response
            
        except:
            import traceback; traceback.print_exc()
    elif filetype=='xls':
        pass
    elif filetype=='pdf':
        pass
    else:
        pass

    
    return HttpResponse(u"%s"%_(u"文件导入操作完成!"))
Exemple #19
0
def save_view(request, app_label, model_name):        
        try:
                ret={}
                op=threadlocals.get_current_user()
                #print op
                obj=GetModel(app_label, model_name)
                para=dict(request.POST)        
                view_name=para['viewname'][0]
                defaultview=""
                
                
                vi=ViewModel.objects.filter(model__exact=ContentType.objects.get_for_model(obj),name__exact=view_name,create_operator__exact=op.username)
                if vi:
                        newview=vi[0]
                else:
                        newview=ViewModel()                
                newview.name=para['viewname'][0]
                newview.viewtype=para['viewtype'][0]
                col_set=[]
                fun_set={}
                filter_set={}
                other_set={}
                sort={}
                fieldswidth={}
                sort["firstsort"]=[para['firstsort'][0],para['sort1'][0]]
                sort["secondsort"]=[para['secondsort'][0],para['sort2'][0]]
                field_prefix="%s."%obj.__name__
                flen=len(field_prefix)
                #print field_prefix, flen
                view_property={}
                col=[]
                for name,value in para.items():
                        if name not in ['viewname','firstsort','secondsort','sort1','sort2','viewtype']:
                                if name.startswith("_fun_"):                                        
                                        
                                        fun_set[name[5:]]=value[0]                                        
                                        
                                elif name.startswith("_col_"):
                                        name=name[5:]
                                        
                                        if name.find(field_prefix)==0:
                                                col.append([value[0],str(name[flen:])])
                                        elif name.find('.')>0:
                                                col.append([value[0],"__".join(name.split('.'))])
                                
                                elif name.startswith("_filter_"):
                                                filter_set[name[8:]]=value[0]
                                        
                                elif name.startswith("_other_"):
                                        other_set[name[7:]]=value[0]
                                elif name.startswith("_txt_"):
                                        fieldswidth[name[5:]]=value[0]
                                else:
                                        view_property[name]=value[0]
                #print pset
                col.sort()
                for i in col:
                        col_set.append(i[1])
                defaultview=""
                if para.has_key('defaultview'):
                        defaultview='true'
                        view_property['defaultview']='true'
                if defaultview=='true':
                        #print 'find'
                        allvi=ViewModel.objects.filter(model__exact=ContentType.objects.get_for_model(obj),create_operator__exact=op.username)
                        for v in allvi:
                                info=eval(v.info)
                                #print info
                                info["defaultview"]='false'
                                v.info=simplejson.dumps(info)
                                v.save()
                
                view_property['fields']=col_set
                view_property['action']=fun_set
                view_property['filter']=filter_set
                view_property['other']=other_set
                view_property['sort']=sort                
                
                view_property['fieldswidth']=fieldswidth                
                pset=simplejson.dumps(view_property)
                newview.info=pset
                newview.model=ContentType.objects.get_for_model(obj)
                newview.save()
                vj=get_all_viewJson(obj)
                
        except:
                import traceback; traceback.print_exc()
                
                ret["flag"]="false"
                ret["msg"]="save fail"
                ret["options"]=""
                return getJSResponse(smart_str(simplejson.dumps(ret)))
        ret["flag"]="true"
        ret["msg"]="save success!"
        ret["options"]=vj
        
        return getJSResponse(smart_str(simplejson.dumps(ret)))
Exemple #20
0
def get_form_(request, app_label, model_name, op_name):
    '''
    根据 op_name 得到 表单视图 2
    '''
    ############## 根据 HTTP_REFERER 来判断是否是 从worktable页链接而 ######################
    is_worktable = ""
    if request.META.has_key('HTTP_REFERER'):  #---Referer:从哪个页面链接过来的
        is_worktable = request.META['HTTP_REFERER']
    if is_worktable.find("worktable") != -1:
        is_worktable = True
    else:
        is_worktable = False
    ############## 得到操作的模型, 及ModelOperation 对象 op_name###############
    model = GetModel(app_label, model_name)
    if not model: return NoFound404Response(request)
    if not hasattr(model, op_name): return NoFound404Response(request)
    op = getattr(model, op_name)
    if not (type(op) == types.TypeType and issubclass(op, ModelOperation)):
        return NoFound404Response(request)
    ############## 当前用户操作权限的判断###############
    if op_name.startswith("_"):
        opn = op_name[1:]
    else:
        opn = op_name
    if model.__name__ == "Group":
        opn = "groupdel"
    if not data_utils.hasPerm(request.user, model, opn.lower()):
        return HttpResponse("session_fail_or_no_permission")
    ############## 操作表单提交的处理和生成操作页的处理###############
    if request.method == 'POST':
        if issubclass(model, Model) and not issubclass(model, CachingModel):
            keys = request.REQUEST.getlist("K")
            ret = []
            objs = model.objects.filter(pk__in=keys)
            try:
                op_class = op
                for obj in objs:
                    if len(op_class.params) == 0:
                        op = op_class(obj)
                        ret.append("%s" % (op.action(**{}) or ""))
                        msg = u"%s(%s) %s" % (op.verbose_name, "", ret or "")
                        LogEntry.objects.log_action_other(
                            request.user.pk, obj, msg)
            except Exception, e:
                ret.append(u"%s" % e)
            if not "".join(ret):
                return HttpResponse('{ Info:"OK" }')
            else:
                return HttpResponse('<ul class="errorlist"><li>%s </li></ul>' %
                                    ("".join(ret)))
        else:
            try:
                ret = model.model_do_action(
                    op_name, request,
                    form_field=form_field)  #-----------------关键点
                if not ret:
                    return HttpResponse('{ Info:"OK" }')  # 操作处理结束 返回结果到前端
                if isinstance(ret, HttpResponse): return ret
                if isinstance(ret, forms.Form):
                    f = ret
                else:
                    return HttpResponse(
                        u"{ errorCode:-1,\nerrorInfo:\"%s\" }" % ret)
            except Exception, e:
                return HttpResponse(u"{ errorCode:-1,\nerrorInfo:\"%s\" }" % e)
def file_import(request):                   #文件导入处理
    filename=""
    filetype=""
    tablename=""
    sparatorvalue=","
    fields={}               #已选择字段列表
    target=[]               #目标文件列号
    errmode=1               #出错处理方式     1  跳过错误 继续处理     2  退出,并删除已导入记录
    headln=1
    recordln=2
    unicode_="utf-8"
    relatefield=[]
    relrecs=[]
    addrelate=1             #关联记录处理  1   自动增加       2  关键记录不存在,跳过当次记录,不增加关联记录
    
    data=dict(request.POST)
    #print data
    errmode=int(data["errmode"][0])
    filename=data["txtfilename"][0]
    filetype=data["txtfiletype"][0]
    sparatorvalue=data["sparatorvalue"][0]
    headln=int(data["headln"][0])
    recordln=int(data["recordln"][0])
    tablename=data["txttablename"][0]
    unicode_=data["unicode"][0].decode()
    addrelate=int(data["addrelate"][0])
    
    #查找字段列表,目标列号
    for n,v in data.items():
        if n.startswith("_chk_"):
            
            field=str(data["_select_"+ n[5:]][0]).decode(unicode_)
            fields[field]=int(n[5:])
    #查找模型
    model,flds,rlfield=findAllFieldsAndModel(tablename)
    objlist=[]
    Employee=GetModel("personnel","Employee")
    Department=GetModel("personnel","Department")
    error_list=[]
    
    try:
        if filetype=="txt" or filetype=="csv":
            fs=file(uploadpath+filename,"r")
            rec=fs.readline()
            ln=1
            while rec!="":
                try:
                    #logger.info(ln)
                    rec=rec.decode(unicode_)
                    if rec.endswith("\r\n"):
                        rec=rec[:len(rec)-2]
                    linedata=rec.split(sparatorvalue)
                    ltmp=[]
                    #logger.info("linedata:",linedata)
                    for l in linedata:
                        if l.startswith('"') and l.endswith('"'):
                            ltmp.append(u"%s"%l[1:len(l)-1])
                        else:
                            ltmp.append(u"%s"%l)
                    linedata=ltmp
                    currelobj=[]                                                                        #当前行外键实例列表
                    if len(linedata)>=len(fields.keys()):                                                #当前行记录不满足已选择字段
                        if ln>=recordln:                            
                            strwhere={}
                            upobj=""
                            isSave=True
                            try:
                                for tmpfld,tmpfldvalue in fields.items():
                                    rf=""
                                    if tmpfld.find(".")>0:
                                        for f in model._meta.fields:
                                            if isinstance(f,ForeignKey):
                                                if f.rel.to.__name__==tmpfld.split(".")[0]:
                                                    strwhere[str(f.name+"__"+tmpfld.split(".")[1]+"__exact")]=linedata[tmpfldvalue]
                                    else:   
                                        strwhere[str(tmpfld+"__exact")]=linedata[tmpfldvalue]
                                upobj=model.objects.filter(Q(**strwhere))
                            except Exception, e:
                                logger.error("%s"%e)
                            if upobj:
                                obj=upobj[0]
                            else:
                                obj=model()
                            for fld,value in fields.items():
                                relObj=""
                                isForeignKey=False
                                if fld.find(".")>0:                                                     #查找到需要保存关联字段
                                    print "find relate"
                                    for nkey,val in rlfield.items():                                 #查找关联记录,更新或创建,并保存
                                        if nkey.__name__==fld.split(".")[0]:
                                            strfilter={}
                                            for f  in fields:                                       #查找关联表多个相应的字段,并生成表达式
                                                if f.find(".")>0 :
                                                    if f.split(".")[0]==nkey.__name__:
                                                        tmpvalue=linedata[fields[f]]
                                                        #tmpvalue=tmpvalue.encode('utf-8')
                                                        strfilter[str(f.split(".")[1]+"__exact")]=tmpvalue
                                            
                                            if strfilter:
                                                relObj=nkey.objects.filter(Q(**strfilter))
                                            
                                            if len(relObj)<=0:                              #查找不到记录,生成新记录
                                                if addrelate!=1:
                                                   isSave=False
                                                   break     
                                                else:
                                                    relObj=nkey()                                        
                                                    for tfld in fields.keys():
                                                        if tfld.find(".")>0:
                                                            if tfld.split(".")[0]==nkey.__name__:
                                                                relObj.__setattr__(tfld.split(".")[1],linedata[fields[tfld]])
                                                    isForeignKey=True
                                                    relObj.save()
                                                    relrecs.append(relObj)
                                            else:
                                                isForeignKey=True
                                                relObj=relObj[0]
                                                
                                            currelobj.append(relObj)
                                            break
                                if not isSave:
                                    break                           #跳出当前行
                                            
                                tobj=""
                                fieldname=""
                                if isForeignKey:
                                    for f  in obj._meta.fields:    #查找字段是否是外键
                                        if isinstance(f,ForeignKey) and  f.rel.to.__name__==fld.split(".")[0]:
                                            for tobj in currelobj:
                                                if tobj==f.rel.to:
                                                    break        
                                            fieldname=f.name
                                            break

                                    obj.__setattr__(fieldname,tobj)
                                else:
                                    if fld=="PIN":
                                        
                                        model_emp=sys.modules['mysite.personnel.models.model_emp']
                                        settings=sys.modules['mysite.settings']
                                        
                                        if len(str(linedata[value]).strip())>getattr(settings,"PIN_WIDTH"):
                                            raise Exception(u"%s"%_(u"人员编号长度过长"))
                                        else:
                                            linedata[value]=getattr(model_emp,"format_pin")(str(linedata[value]))
                                    if fld=="code":
                                        
                                        dept=Department.objects.filter(code=linedata[value])
                                        if dept:
                                            raise Exception(u"%s"%_(u'部门编号已存在'))
                                    obj.__setattr__(fld,linedata[value])

                            #logger.info("file Line:%s  save is %s "%(ln,isSave))
                            if isSave:
                                obj.save()
                                
                                if type(obj)==Employee:
                                   obj.__setattr__('attarea',(1,))
                                   obj.save()
                                if type(obj)==Department:
                                    if obj.parent==None or obj.parent=="":                                        
                                         obj.parent_id=1
                                         obj.save()
                                
                                objlist.append(obj)
                    ln+=1
                    rec=fs.readline()
                except Exception,e:
                    #logger.error("%s"%e)
                    try:
                        error_list.append(str(ln)+u" 行      "+u"%s"%e)
                    except:
                        error_list.append(str(ln))
                        pass
                    
                    if errmode==1:                        
                        ln+=1
                        rec=fs.readline()                       
                        continue
                    else:
                        raise