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 __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 set_msg_read(request, datakey): u = threadlocals.get_current_user() try: um = UsrMsg() um.user = u um.msg = InstantMsg.objects.filter(pk=datakey)[0] um.readtype = "1" um.save() return getJSResponse('{ Info:"OK" }') except: import traceback traceback.print_exc() return getJSResponse('{ Info:"exception!" }')
def get_instant_msg(request): u = threadlocals.get_current_user() if u and u.is_anonymous(): return getJSResponse(u"[]") d = {} qs = None [SYSMSG, ATTMSG, IACCESSMSG, PERSONNELMSG] = [1, 2, 3, 4] exclude_msgtype = [] if "mysite.att" not in settings.INSTALLED_APPS: exclude_msgtype.append(ATTMSG) if "mysite.iaccess" not in settings.INSTALLED_APPS: exclude_msgtype.append(IACCESSMSG) msgtypes = MsgType.objects.exclude(pk__in=exclude_msgtype) dt = datetime.datetime.now() dt = datetime.datetime(year=dt.year, month=dt.month, day=dt.day) # 持续时间过滤条件 querys = [] for elem in msgtypes: begin_date = dt - datetime.timedelta(days=elem.msg_keep_time) querys.append((Q(change_time__gte=begin_date) & Q(msgtype=elem))) combine_query = querys[0] for i in querys[1:]: combine_query |= i # 不是超级管理员过滤条件 if not u.is_superuser: ms = GroupMsg.objects.filter(group__user=u).values_list("msgtype") d["msgtype__in"] = ms # 是否已读过滤条件 has_read = UsrMsg.objects.filter(user=u).values_list("msg") qs = InstantMsg.objects.filter(**d).exclude(id__in=has_read) qs = qs.filter(combine_query).order_by("-pk") json_data = { "fields": ["id", "msgtype", "content", "change_time"], "data": [] } for ee in qs: json_data["data"].append([ ee.id, u"%s" % ee.msgtype, ee.content, ee.change_time.strftime("%Y-%m-%d") ]) return getJSResponse(json.dumps(json_data))
def delete(self): if self.Admin.cache: key = cache_key(self, self.pk) cache.set(key, None) cache.delete(key) print('------CachingModel delete: %s---------' % key) if self.Admin.log: 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_query_set(self): qs = super(RowCacheManager, self).get_query_set() try: # 根据 status 排除已经删除/停用的数据 if hasattr(self.model, "can_restore") and self.model.can_restore: qs = qs.exclude(status=STATUS_INVALID) pass # 修改已删除人员历史记录显示为空的问题 else: qs = qs.exclude(status=STATUS_STOP).exclude( status=STATUS_INVALID) except: pass op = threadlocals.get_current_user() if (op is None) or op.is_anonymous(): return qs if not hasattr(op, "customer_id"): return qs # TODO: 根据当前用户的权限过滤数据 # 根据登录用户所属客户,过滤出该客户的数据 if hasattr(qs.model, "customer"): qs = qs.filter(customer_id=op.customer_id) return qs
def save(self, *args, **kwargs): is_new = False if self.pk is None or self.create_time is 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 old_obj = None 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 ]: # 只显示非自动维护字段的改变 if field.choices: old_value = ( old_obj.__getattribute__("get_" + field_name + "_display")()) or "" new_value = (self.__getattribute__("get_" + field_name + "_display")()) or "" else: 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__)) # if SYNC_MODEL: # hk = save_hook(is_new,self,old_obj).check() # super(CachingModel, self).save(*args, **kwargs) # if SYNC_MODEL: # hk.sync() 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 表示强制不写日志 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[0:511] 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 get_all_app_and_models(hide_visible_false=True, trans_apps=[]): lng = get_language() usr = threadlocals.get_current_user() if hide_visible_false: cache_key = "%s_%s_%s" % (lng, usr.username, "menu_list") else: cache_key = "%s_%s_%s" % (lng, usr.username, "menu_list_with_hide") if usr.is_anonymous(): cache.delete(cache_key) menu_list = cache.get(cache_key) if menu_list: return menu_list apps = {} tmp_apps = [e for e in settings.INSTALLED_APPS] if trans_apps: tmp_apps = trans_apps for application in tmp_apps: app_label = application.split(".")[-1] apps[app_label] = {'models': [], 'is_app_true': 'true'} for app_label in apps.keys(): print("==========appskey=", app_label, "==", apps[app_label]) app = get_app(app_label) print("==========typeofapp=", type(app)) 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): print("==========i=", i) app_menu = None try: model = app.__getattribute__(i) m0 = {} if issubclass(model, models.Model) and (model._meta.app_label == 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) elif issubclass(model, AppOperation) and hasattr( model, 'view'): 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 elif issubclass(model, AppPage): app_menu = hasattr( model, 'app_menu') and model.app_menu or app_label menu_group = app_menu if usr.has_perm( "contenttypes.can_%s" % model.__name__) or (not model.visible and not hide_visible_false): m0 = { 'verbose_name': u"%(name)s" % { 'name': hasattr(model, "verbose_name") and model.verbose_name or (u"%s" % _(model.__name__)) }, 'model': None, 'page': model, 'operation': model, 'menu_group': menu_group, 'url': '/page/%s/%s/' % (menu_group, model.__name__), #reverse(model.view.im_func), 'index': model.menu_index, 'visible': model.visible } 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 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