PERMISSIONS = [ ('view_device', 'Can view device'), ('add_device', 'Can add device'), ('change_device', 'Can change device'), ('delete_device', 'Can delete device'), ('view_maintenance_record', 'Can view maintenance record'), ('add_maintenance_record', 'Can add maintenance record'), ('change_maintenance_record', 'Can change maintenance record'), ('delete_maintenance_record', 'Can delete maintenance record'), ('view_fault_report', 'Can view fault report'), ('add_fault_report', 'Can add fault report'), ('change_fault_report', 'Can change fault report'), ('delete_fault_report', 'Can delete fault report'), ('view_maintenance_plan', 'Can view maintenance plan'), ('add_maintenance_plan', 'Can add maintenance plan'), ('change_maintenance_plan', 'Can change maintenance plan'), ('delete_maintenance_plan', 'Can delete maintenance plan'), ('view_device_image', 'Can view device image'), ('add_device_image', 'Can add device image'), ('change_device_image', 'Can change device image'), ('delete_device_image', 'Can delete device image'), ] for codename, name in PERMISSIONS: permission, created = Permission.objects.get_or_create(codename=codename, name=name) if created: print(f'Created permission {permission}') GROUPS = [ ('admin', ['view_device', 'add_device', 'change_device', 'delete_device', 'view_maintenance_record', 'add_maintenance_record', 'change_maintenance_record', 'delete_maintenance_record', 'view_fault_report', 'add_fault_report', 'change_fault_report', 'delete_fault_report', 'view_maintenance_plan', 'add_maintenance_plan', 'change_maintenance_plan', 'delete_maintenance_plan', 'view_device_image', 'add_device_image', 'change_device_image', 'delete_device_image']), ('manager', ['view_device', 'add_device', 'change_device', 'view_maintenance_record', 'add_maintenance_record', 'change_maintenance_record', 'view_fault_report', 'add_fault_report', 'change_fault_report', 'view_maintenance_plan', 'add_maintenance_plan', 'change_maintenance_plan', 'view_device_image', 'add_device_image', 'change_device_image']), ('user', ['view_device', 'view_maintenance_record', 'view_fault_report', 'view_maintenance_plan', 'view_device_image']), ] for group_name, permissions in GROUPS: group, created = Group.objects.get_or_create(name=group_name) if created: print(f'Created group {group}') for codename in permissions: permission = permission.objects.get(codename=codename) group.permissions.add(permission) print(f'Add permission {permission} to group {group}')
时间: 2023-12-31 20:06:41 浏览: 35
这是一段 Python 代码,它使用 Django 模型中的 Permission 和 Group 对象创建权限和用户组,并将权限分配给用户组。首先,它定义了一个包含权限代码和名称的元组列表 PERMISSIONS,一个包含用户组名称和该组所拥有的权限的元组列表 GROUPS。然后,对于每个权限元组,它使用 get_or_create() 方法查找具有给定codename和name的Permission对象。如果对象不存在,则会创建一个新的Permission对象,并将其存储在permission变量中。最后,如果新的Permission对象被创建,它会打印一条消息来指示成功创建了该权限。
接下来,对于每个用户组元组,它使用 get_or_create() 方法查找具有给定名称的Group对象。如果对象不存在,则会创建一个新的Group对象,并将其存储在group变量中。最后,对于该组所拥有的每个权限代码,它使用 get() 方法查找Permission对象,并使用 add() 方法将该权限添加到该组。如果成功添加,则会打印一条消息来指示成功将该权限添加到该组。
相关问题
buildozer.spec 申请内部存储权限 android.permissions = WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE 之后在程序中怎么写
在程序中,你可以使用以下代码来检查和获取内部存储权限:
```python
import android.permissions as permissions
from android.storage import primary_external_storage_path
# 检查是否拥有内部存储权限
if not permissions.check_permission('android.permission.WRITE_EXTERNAL_STORAGE'):
# 请求内部存储权限
permissions.request_permissions(['android.permission.WRITE_EXTERNAL_STORAGE'])
# 获取内部存储路径
internal_storage_path = primary_external_storage_path()
```
上述代码中,我们使用 `check_permission` 方法来检查是否具有 `WRITE_EXTERNAL_STORAGE` 权限,如果没有则调用 `request_permissions` 方法请求权限。
获取内部存储路径我们使用了 `primary_external_storage_path` 方法,它会返回一个字符串,表示内部存储的路径。你可以将这个路径作为文件的存储路径,例如:
```python
file_path = internal_storage_path + '/myfile.txt'
with open(file_path, 'w') as f:
f.write('Hello, world!')
```
class UserCache(UserMixin): """用户表缓存""" userid: str username: str alternative_id: str homepage: str permissions: list def get_id(self): """使用替代用户ID,当账号信息发生变化时,替代ID更改为新的随机生成的值,确保他们的旧身份验证会话不再有效。""" return self.alternative_id @staticmethod def add_user_cache(alternative_id, **kwargs): """添加user缓存""" user_key = PROJECT_NAME + '-' + str(alternative_id) Redis().hset(user_key, 'alternative_id', str(alternative_id)) for name, value in kwargs.items(): Redis().hset(user_key, name, value) Redis().expire(user_key, SIGNIN_LIFETIME) return True @staticmethod def del_user_cache(alternative_id: str): """删除user缓存""" Redis().delete(PROJECT_NAME + '-' + alternative_id) return True @staticmethod def get_user_cache(alternative_id) -> object: """获取user缓存""" user_cache_dict = Redis(decode_responses=True).hgetall(PROJECT_NAME + '-' + str(alternative_id)) if user_cache_dict: user_cache = UserCache() user_cache.userid = user_cache_dict.get('userid') user_cache.username = user_cache_dict.get('username') user_cache.alternative_id = user_cache_dict.get('alternative_id') user_cache.homepage = user_cache_dict.get('homepage') user_cache.permissions = user_cache_dict.get('permissions').split(",") # redis里存的是字符串,转为列表 print(user_cache.permissions) return user_cache 帮我优化或者提建议,包括命名
首先,对于这个类的命名,建议在类名后面加上一个表示缓存的单词,可以是 `Cache` 或者 `Cacher` 等。比如 `UserCacher` 或 `UserCacheManager`。
其次,在 `add_user_cache` 方法中,`Redis()` 被多次调用,建议只实例化一次并在方法中传递。另外,在循环中多次调用 `Redis().hset`,这样做可能会导致性能问题。建议将要设置的值存储在一个字典中,然后一次性调用 `Redis().hmset` 方法。类似的,`del_user_cache` 方法中也可以重构类似的循环和多次调用 `Redis()` 的问题。
最后,在 `get_user_cache` 方法中,建议使用 `getattr` 函数来从字典中获取属性的值,这样可以避免在字典中没有找到指定的属性时引发 `AttributeError` 异常。另外,由于 `permissions` 可能为空字符串,建议在转换为列表前先进行非空判断。
综上所述,下面是一个经过优化的 `UserCacher` 类的示例代码:
```
class UserCacher(UserMixin):
"""用户表缓存管理"""
userid: str
username: str
alternative_id: str
homepage: str
permissions: list
@staticmethod
def add_user_cache(redis, alternative_id, **kwargs):
"""添加用户缓存"""
user_key = f"{PROJECT_NAME}-{alternative_id}"
values = {"alternative_id": str(alternative_id)}
values.update(kwargs)
redis.hmset(user_key, values)
redis.expire(user_key, SIGNIN_LIFETIME)
return True
@staticmethod
def del_user_cache(redis, alternative_id: str):
"""删除用户缓存"""
redis.delete(f"{PROJECT_NAME}-{alternative_id}")
return True
@staticmethod
def get_user_cache(redis, alternative_id) -> object:
"""获取用户缓存"""
user_cache_dict = redis.hgetall(f"{PROJECT_NAME}-{alternative_id}")
if user_cache_dict:
user_cache = UserCacher()
user_cache.userid = user_cache_dict.get('userid')
user_cache.username = user_cache_dict.get('username')
user_cache.alternative_id = user_cache_dict.get('alternative_id')
user_cache.homepage = user_cache_dict.get('homepage')
user_cache.permissions = user_cache_dict.get('permissions')
if user_cache.permissions:
user_cache.permissions = user_cache.permissions.split(",")
return user_cache
```
希望对你有所帮助!