def __getitem__(self, item): #if item in self._cache: return self._cache[item] op = threadlocals.get_current_user() if op and op.is_anonymous(): op = None if '.' not in item: value = getattr(settings, item) else: items = item.split(".", 1) value = None try: opt = Option.objects.get(app_label=items[0], name=items[1]) except ObjectDoesNotExist: return None try: if op: opt = PersonalOption.objects.get(option=opt, user=op) value = opt.value except ObjectDoesNotExist: pass if value == None: try: opt = SystemOption.objects.get(option=opt) value = opt.value except ObjectDoesNotExist: value = opt.default self._cache[item] = value return value
def __setitem__(self, item, value): """ 修改一个系统配置项的值到用户个性化设置中,这主要用于系统运行期保存一些个性化的参数设置。 """ if self.__getitem__(item) == value: return if item in self._cache: self._cache.pop(item) op = threadlocals.get_current_user() if op and op.is_anonymous(): op = None items = item.split(".", 1) opt = Option.objects.get(app_label=items[0], name=items[1]) try: p_opt = PersonalOption.objects.get(option=opt, user=op) except ObjectDoesNotExist: p_opt = PersonalOption(option=opt, user=op) #create it if not exists if not (p_opt.value == value): p_opt.value = value p_opt.save() if item == 'base.language': from django.utils.translation import check_for_language, activate, get_language request = threadlocals.get_current_request() if request: lang_code = value if lang_code and check_for_language(lang_code): if hasattr(request, 'session'): request.session['django_language'] = lang_code activate(lang_code) request.LANGUAGE_CODE = get_language() self._cache[item] = value
def save(self): from middleware import threadlocals if not self.id: self.created_by = threadlocals.get_current_user() self.updated_on = datetime.now() super(Blog, self).save()
def save(self): from middleware import threadlocals if not self.id: self.created_by = threadlocals.get_current_user() self.updated_on = datetime.now() super(Content, self).save()
def delete(self): if self.Admin.cache: # 是否缓存 key = cache_key(self, self.pk) cache.set(key, None) cache.delete(key) if self.Admin.log: # 是否做日志记录 from models_logentry import LogEntry, DELETION op = threadlocals.get_current_user() if op and op.is_anonymous(): op = None LogEntry.objects.log_action( user_id=op and op.pk or None, content_type_id=ContentType.objects.get_for_model(self).pk, object_id=self.pk, object_repr=force_unicode(self), action_flag=DELETION) super(CachingModel, self).delete()
def save(self): #print 'user ='******'user_id', None) is None: self.user_id = threadlocals.get_current_user().id # disregard any modifications to ip address self.ip = threadlocals.get_current_ip() # self.ip = '127.0.0.1' if self.previous is not None: self.odate = self.previous.odate elif not self.id: # only do the following on creation, not modification self.odate = datetime.now() super(Post, self).save()
def update_record(sender, instance, created, **kwargs): registered = [] for app, mdl in AUDITED_MODELS: registered.append(django.db.models.get_model(app, mdl)) if sender in registered: userid = None ut = None details = '' requestuser = threadlocals.get_current_user() if isinstance(instance, User): user = instance else: try: user = instance.user except: user = None if requestuser != None: userid = requestuser.id details += 'model %s;' % sender.__name__ if created == True: ut = UpdateType.objects.get(name = "joined") details += "new;" else: details += "edited;" if ut == None: ut = UpdateType.objects.get(name = "update") try: state = pickle.dumps(instance, protocol=0) except: state = None url = threadlocals.get_url() result = isinstance(user, AnonymousUser) if result: user = None details += "AnonymousUser, new account or a login.;" log = Log.objects.create( user = user, update_type = ut, by_user_id = userid, url = url, details = details, state = state )
def delete(self): if self.Admin.cache: # 是否缓存 key = cache_key(self, self.pk) cache.set(key, None) cache.delete(key) if self.Admin.log: # 是否做日志记录 from models_logentry import LogEntry, DELETION op = threadlocals.get_current_user() if op and op.is_anonymous(): op = None LogEntry.objects.log_action( user_id=op and op.pk or None, content_type_id=ContentType.objects.get_for_model(self).pk, object_id=self.pk, object_repr=force_unicode(self), action_flag=DELETION, ) super(CachingModel, self).delete()
def get_all_app_and_models(hide_visible_false=True): ''' 获取系统所有界面可视模型信息 条件: 对象类型:Model (_meta.app_label存在) AppOperation (含 view 成员) 非 _meta.abstract 有 browse_model 权限 有 browse_model 权限 配置项: verbose_name、visible、menu_index、app_menu、parent_model、select_related_perms、hide_perms、cancel_perms、menu_group verbose_name、visible、_menu_index、_app_menu、_parent_model、_select_related_perms、_hide_perms、_cancel_perms、add_model_permission ''' from django.conf import settings from base.translation import DataTranslation, _ugettext_ as _ from django.db.models.loading import get_app from django.db import models from django.core.urlresolvers import reverse from django.core.cache import cache from middleware import threadlocals usr=threadlocals.get_current_user() cache_key = "%s_%s"%(usr.username,"menu_list") # 当前用户菜单列表缓存名 if usr.is_anonymous(): cache.delete(cache_key) menu_list= None#cache.get(cache_key) # 不使用缓存 if menu_list: return menu_list ################# 创建开始 #################### apps={} for application in settings.INSTALLED_APPS: # 首要条件必须在安装的app中 if application in settings.INVISIBLE_APPS: continue # 去掉隐藏的app app_label=application.split(".")[-1] apps[app_label]={ 'models':[], 'is_app_true':'true' } for app_label in apps.keys(): app=get_app(app_label) # django 关键 api 的使用 apps[app_label]['name']=u"%(name)s"%{'name':hasattr(app, "verbose_name") and app.verbose_name or unicode(DataTranslation.get_field_display(ContentType, 'app_label', app_label))} apps[app_label]['index']=hasattr(app, '_menu_index') and app._menu_index or 9999 for i in dir(app): # 条件二:在app.models 中的对象 如app/models/__init__.py app_menu=None try: model=app.__getattribute__(i) # 得到成员对象 m0={} ##################### model 对象 ##################### if issubclass(model, models.Model) and (model._meta.app_label==app_label): # 条件三:成员为model,app_label不为空 admin=hasattr(model, "Admin") and model.Admin or None if not model._meta.abstract: perm='%s.%s_%s'%(model._meta.app_label, "browse",model.__name__.lower()) if usr.has_perm(perm): m0={'verbose_name': u"%(name)s"%{'name':model._meta.verbose_name},'model':model, 'index':9999} if (not admin or not hasattr(admin, "visible") or admin.visible): m0["visible"]=True else: m0["visible"]=False if hasattr(admin, "menu_index"): m0['index']=admin.menu_index if hasattr(admin, "parent_model"): m0["parent_model"]=admin.parent_model if hasattr(admin,"select_related_perms"): m0["select_related_perms"]=admin.select_related_perms if hasattr(admin,"hide_perms"): m0["hide_perms"]=admin.hide_perms if hasattr(admin,"cancel_perms"): m0["cancel_perms"]=admin.cancel_perms app_menu=app_label if hasattr(admin, "app_menu"): app_menu=admin.app_menu m0['menu_group'] = hasattr(admin, "menu_group") and admin.menu_group or app_label#未配置时取app_menu(即app_label) ##################### AppOperation 对象 ##################### elif issubclass(model, AppOperation) and hasattr(model, 'view'): # 含view成员的 AppOperation operation_flag=hasattr(model,'operation_flag') and model.operation_flag or "true" menu_group = hasattr(model, '_menu_group') and model._menu_group or app_label#未配置时取app_menu(即app_label) if usr.has_perm("contenttypes.can_%s"%model.__name__): m0={'verbose_name':u"%(name)s"%{'name': hasattr(model, "verbose_name") and model.verbose_name or (u"%s"%_(model.__name__))}, 'model':None, 'operation': model, 'menu_group': menu_group, 'operation_flag':operation_flag, # 'url': reverse(model.view.im_func), 'index': 9999} if (not hasattr(model, 'visible') or getattr(model,'visible')): m0["visible"]=True else: m0["visible"]=False if hasattr(model, 'add_model_permission'): m0["add_model_permission"]=model.add_model_permission if hasattr(model, '_parent_model'): m0["parent_model"]=model._parent_model if hasattr(model, "_menu_index"): m0['index']=model._menu_index if hasattr(model,"_select_related_perms"): m0["select_related_perms"]=model._select_related_perms if hasattr(model,"_hide_perms"): m0["hide_perms"]=model._hide_perms if hasattr(model,"_cancel_perms"): m0["cancel_perms"]=model._cancel_perms app_menu=app_label if hasattr(model, "_app_menu"): app_menu=model._app_menu ################## 创建 models 部分信息 ###################### if m0: m0['app_label']=app_label m0['name']=u"%(name)s"%{'name':model.__name__} if app_menu not in apps: apps[app_menu]={ 'name':u"%(name)s"%{'name':_(app_menu)}, 'models': [m0,], 'index': hasattr(app, '_menu_index') and app._menu_index or 9999 } else: apps[app_menu]['models'].append(m0) except TypeError: pass except: import traceback; traceback.print_exc() pass ############### 隐藏和排序处理(两级排序 ) ################################3 if hide_visible_false: for k,v in apps.items(): vmodels=[m for m in v['models'] if m["visible"]] # 第三个条件 v['models']=vmodels mlist=[(k,v) for k,v in apps.items() if v['models']] # 第四个条件 mlist.sort(lambda x1,x2: x1[1]['index']-x2[1]['index']) for m in mlist: m[1]['models'].sort(lambda x1,x2: (x1['index']-x2['index']) or (x1['name']>=x2['name'] and 1 or -1)) #return dict(mlist)不能排序 cache.set(cache_key,mlist,60*60*24) return mlist
def get_all_app_and_models(hide_visible_false=True): ''' 获取系统所有界面可视模型信息 条件: 对象类型:Model (_meta.app_label存在) AppOperation (含 view 成员) 非 _meta.abstract 有 browse_model 权限 有 browse_model 权限 配置项: verbose_name、visible、menu_index、app_menu、parent_model、select_related_perms、hide_perms、cancel_perms、menu_group verbose_name、visible、_menu_index、_app_menu、_parent_model、_select_related_perms、_hide_perms、_cancel_perms、add_model_permission ''' from django.conf import settings from base.translation import DataTranslation, _ugettext_ as _ from django.db.models.loading import get_app from django.db import models from django.core.urlresolvers import reverse from django.core.cache import cache from middleware import threadlocals usr = threadlocals.get_current_user() cache_key = "%s_%s" % (usr.username, "menu_list") # 当前用户菜单列表缓存名 if usr.is_anonymous(): cache.delete(cache_key) menu_list = None #cache.get(cache_key) # 不使用缓存 if menu_list: return menu_list ################# 创建开始 #################### apps = {} for application in settings.INSTALLED_APPS: # 首要条件必须在安装的app中 if application in settings.INVISIBLE_APPS: continue # 去掉隐藏的app app_label = application.split(".")[-1] apps[app_label] = {'models': [], 'is_app_true': 'true'} for app_label in apps.keys(): app = get_app(app_label) # django 关键 api 的使用 apps[app_label]['name'] = u"%(name)s" % { 'name': hasattr(app, "verbose_name") and app.verbose_name or unicode( DataTranslation.get_field_display(ContentType, 'app_label', app_label)) } apps[app_label]['index'] = hasattr( app, '_menu_index') and app._menu_index or 9999 for i in dir(app): # 条件二:在app.models 中的对象 如app/models/__init__.py app_menu = None try: model = app.__getattribute__(i) # 得到成员对象 m0 = {} ##################### model 对象 ##################### if issubclass(model, models.Model) and ( model._meta.app_label == app_label): # 条件三:成员为model,app_label不为空 admin = hasattr(model, "Admin") and model.Admin or None if not model._meta.abstract: perm = '%s.%s_%s' % (model._meta.app_label, "browse", model.__name__.lower()) if usr.has_perm(perm): m0 = { 'verbose_name': u"%(name)s" % { 'name': model._meta.verbose_name }, 'model': model, 'index': 9999 } if (not admin or not hasattr(admin, "visible") or admin.visible): m0["visible"] = True else: m0["visible"] = False if hasattr(admin, "menu_index"): m0['index'] = admin.menu_index if hasattr(admin, "parent_model"): m0["parent_model"] = admin.parent_model if hasattr(admin, "select_related_perms"): m0["select_related_perms"] = admin.select_related_perms if hasattr(admin, "hide_perms"): m0["hide_perms"] = admin.hide_perms if hasattr(admin, "cancel_perms"): m0["cancel_perms"] = admin.cancel_perms app_menu = app_label if hasattr(admin, "app_menu"): app_menu = admin.app_menu m0['menu_group'] = hasattr( admin, "menu_group" ) and admin.menu_group or app_label #未配置时取app_menu(即app_label) ##################### AppOperation 对象 ##################### elif issubclass(model, AppOperation) and hasattr( model, 'view'): # 含view成员的 AppOperation operation_flag = hasattr( model, 'operation_flag') and model.operation_flag or "true" menu_group = hasattr( model, '_menu_group' ) and model._menu_group or app_label #未配置时取app_menu(即app_label) if usr.has_perm("contenttypes.can_%s" % model.__name__): m0 = { 'verbose_name': u"%(name)s" % { 'name': hasattr(model, "verbose_name") and model.verbose_name or (u"%s" % _(model.__name__)) }, 'model': None, 'operation': model, 'menu_group': menu_group, 'operation_flag': operation_flag, # 'url': reverse(model.view.im_func), 'index': 9999 } if (not hasattr(model, 'visible') or getattr(model, 'visible')): m0["visible"] = True else: m0["visible"] = False if hasattr(model, 'add_model_permission'): m0["add_model_permission"] = model.add_model_permission if hasattr(model, '_parent_model'): m0["parent_model"] = model._parent_model if hasattr(model, "_menu_index"): m0['index'] = model._menu_index if hasattr(model, "_select_related_perms"): m0["select_related_perms"] = model._select_related_perms if hasattr(model, "_hide_perms"): m0["hide_perms"] = model._hide_perms if hasattr(model, "_cancel_perms"): m0["cancel_perms"] = model._cancel_perms app_menu = app_label if hasattr(model, "_app_menu"): app_menu = model._app_menu ################## 创建 models 部分信息 ###################### if m0: m0['app_label'] = app_label m0['name'] = u"%(name)s" % {'name': model.__name__} if app_menu not in apps: apps[app_menu] = { 'name': u"%(name)s" % { 'name': _(app_menu) }, 'models': [ m0, ], 'index': hasattr(app, '_menu_index') and app._menu_index or 9999 } else: apps[app_menu]['models'].append(m0) except TypeError: pass except: import traceback traceback.print_exc() pass ############### 隐藏和排序处理(两级排序 ) ################################3 if hide_visible_false: for k, v in apps.items(): vmodels = [m for m in v['models'] if m["visible"]] # 第三个条件 v['models'] = vmodels mlist = [(k, v) for k, v in apps.items() if v['models']] # 第四个条件 mlist.sort(lambda x1, x2: x1[1]['index'] - x2[1]['index']) for m in mlist: m[1]['models'].sort(lambda x1, x2: (x1['index'] - x2['index']) or (x1['name'] >= x2['name'] and 1 or -1)) #return dict(mlist)不能排序 cache.set(cache_key, mlist, 60 * 60 * 24) return mlist
def save(self, *args, **kwargs): is_new = False if self.pk == None or self.create_time == None: is_new = True elif kwargs.get("force_insert", False): is_new = True if is_new and kwargs.get("force_update", False): is_new = False log_msg = kwargs.get('log_msg', True) #默认为True #print "save: is_new=%s, self.pk=%s, self.create_time=%s, kwarg=%s"%(is_new, self.pk, self.create_time, kwargs) op = threadlocals.get_current_user() if op and op.is_anonymous(): op = None #print "save: %s self.status:%s"%(self.__class__.__name__,self.status) if is_new: self.create_time = datetime.datetime.now() if op: self.create_operator = op.username else: if self.status == STATUS_INVALID: #标记为删除 self.delete_time = datetime.datetime.now() if op: self.delete_operator = op.username else: #修改 self.change_time = datetime.datetime.now() if op: self.change_operator = op.username #pwp添加具体的修改信息 old_obj = self.__class__.all_objects.filter(pk=self.pk)[0] change_info = [] for field in old_obj._meta.fields: field_name = field.name if field_name == 'status' or field_name not in [ abs_field.name for abs_field in CachingModel._meta.fields ]: #只显示非自动维护字段的改变 old_value = getattr(old_obj, field_name) new_value = getattr(self, field_name) if new_value != old_value and (old_value or "None") != ( new_value or "None"): change_info.append(u"%s(%s->%s)" % (field.verbose_name, old_value or "", new_value or "")) if kwargs.has_key('log_msg') and type( kwargs['log_msg']) != bool: #配置了指定写入的日志信息(默认写入) kwargs['log_msg'] = u"%s" % kwargs[ 'log_msg'] #+ u";".join(change_info) elif change_info: kwargs['log_msg'] = u";".join(change_info) elif self.status != STATUS_INVALID: #不是删除操作 return #没有修改任何数据,无须进行保存操作 log_msg_content = kwargs.pop('log_msg', '') invalidate_cache = kwargs.pop('invalidate_cache', True) #print "save: %s, super save: %s"%(self.__class__.__name__,self.__dict__) super(CachingModel, self).save(*args, **kwargs) if self.Admin.cache and invalidate_cache: key = cache_key(self, self.pk) #print "\tinvalidate_cache:", key cache.delete(key) if log_msg or ( self.Admin.log and log_msg != False ): #log_msg设置了字符串,无论Admin.log都写日志;log_msg=False 表示强制不写日志 from models_logentry import LogEntry, ADDITION, DELETION, CHANGE LogEntry.objects.log_action( user_id=op and op.pk or None, content_type_id=ContentType.objects.get_for_model(self).pk, object_id=self.pk, object_repr=force_unicode(self), action_flag=(is_new and ADDITION) or (self.status == STATUS_INVALID) and DELETION or CHANGE, change_message=log_msg_content or "") if is_new: try: for r in self._meta.get_all_related_objects(): if isinstance(r.field, models.OneToOneField): r.model(**{r.field.name: self}).save() except: pass
def save(self, *args, **kwargs): is_new = False if self.pk == None or self.create_time == None: is_new = True elif kwargs.get("force_insert", False): is_new = True if is_new and kwargs.get("force_update", False): is_new = False log_msg = kwargs.get("log_msg", True) # 默认为True # print "save: is_new=%s, self.pk=%s, self.create_time=%s, kwarg=%s"%(is_new, self.pk, self.create_time, kwargs) op = threadlocals.get_current_user() if op and op.is_anonymous(): op = None # print "save: %s self.status:%s"%(self.__class__.__name__,self.status) if is_new: self.create_time = datetime.datetime.now() if op: self.create_operator = op.username else: if self.status == STATUS_INVALID: # 标记为删除 self.delete_time = datetime.datetime.now() if op: self.delete_operator = op.username else: # 修改 self.change_time = datetime.datetime.now() if op: self.change_operator = op.username # pwp添加具体的修改信息 old_obj = self.__class__.all_objects.filter(pk=self.pk)[0] change_info = [] for field in old_obj._meta.fields: field_name = field.name if field_name == "status" or field_name not in [ abs_field.name for abs_field in CachingModel._meta.fields ]: # 只显示非自动维护字段的改变 old_value = getattr(old_obj, field_name) new_value = getattr(self, field_name) if new_value != old_value and (old_value or "None") != (new_value or "None"): change_info.append(u"%s(%s->%s)" % (field.verbose_name, old_value or "", new_value or "")) if kwargs.has_key("log_msg") and type(kwargs["log_msg"]) != bool: # 配置了指定写入的日志信息(默认写入) kwargs["log_msg"] = u"%s" % kwargs["log_msg"] # + u";".join(change_info) elif change_info: kwargs["log_msg"] = u";".join(change_info) elif self.status != STATUS_INVALID: # 不是删除操作 return # 没有修改任何数据,无须进行保存操作 log_msg_content = kwargs.pop("log_msg", "") invalidate_cache = kwargs.pop("invalidate_cache", True) # print "save: %s, super save: %s"%(self.__class__.__name__,self.__dict__) super(CachingModel, self).save(*args, **kwargs) if self.Admin.cache and invalidate_cache: key = cache_key(self, self.pk) # print "\tinvalidate_cache:", key cache.delete(key) if log_msg or (self.Admin.log and log_msg != False): # log_msg设置了字符串,无论Admin.log都写日志;log_msg=False 表示强制不写日志 from models_logentry import LogEntry, ADDITION, DELETION, CHANGE LogEntry.objects.log_action( user_id=op and op.pk or None, content_type_id=ContentType.objects.get_for_model(self).pk, object_id=self.pk, object_repr=force_unicode(self), action_flag=(is_new and ADDITION) or (self.status == STATUS_INVALID) and DELETION or CHANGE, change_message=log_msg_content or "", ) if is_new: try: for r in self._meta.get_all_related_objects(): if isinstance(r.field, models.OneToOneField): r.model(**{r.field.name: self}).save() except: pass
def save(self): if not self.id: self.date = datetime.now() print get_current_user() self.user = get_current_user() super(Activity, self).save()