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
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 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()
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, })
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)
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'
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 !")
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)
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, ), )
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)
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("× " + u"%s"%_(u"已存在")); else: return HttpResponse("√ " + u"%s"%_(u"可使用"));
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"文件导入操作完成!"))
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)))
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