Exemplo n.º 1
0
def asset_edit(request):
    '''  api/asset/edit POST
    编辑资产
    可编辑的条目有:name, description, parent_id
    return: code =
        200: success
        201: parameter error
        202:no such asset
    '''
    nid, name, description, parent_id, custom = parse_args(request.body,
                                                           'nid',
                                                           'name',
                                                           'description',
                                                           'parent_id',
                                                           'custom',
                                                           parent_id='',
                                                           custom={})

    asset = Asset.objects.get(id=nid)
    try:
        parent = Asset.objects.get(id=parent_id)
    except ValueError:
        parent = None
    else:
        if parent.status != 'IDLE' or asset.status != 'IDLE':
            return gen_response(code=204, message='只能修改空闲资产间的父子关系')

    asset.name, asset.parent = name, parent
    asset.description = description
    try:
        asset.save()
        AssetCustomAttr.update_custom_attrs(asset, custom)
    except InvalidMove:
        return gen_response(code=203, message='无法指定自己成为自己的父资产')
    return gen_response(code=200, message=f'修改资产 {asset.name} 信息')
Exemplo n.º 2
0
def issue_permit_require(request):
    '''
    api/issue/permit-require POST
    资产管理员同意员工的资产申领请求,并向员工分配资产。
    para:
        nid(int): require issue id
        selectedRows(List[int]): 资产id列表
    '''
    issue_id, asset_ids = parse_args(request.body, 'nid', 'selectedRows')
    if not asset_ids:
        return gen_response(code=204, message='没有指定任何资产')
    issue: RequireIssue = RequireIssue.objects.get(id=issue_id)
    assets = set()
    for asset_id in asset_ids:
        asset: Asset = Asset.objects.get(id=asset_id)
        assets.update(asset.get_entire_tree())
    for asset in assets:
        asset.owner = issue.initiator
        asset.status = 'IN_USE'
        asset._change_reason = '领用'
        asset.save()
        issue.asset.add(asset)
    issue.status = 'SUCCESS'
    issue.save()
    return gen_response(code=200, message=f"{request.user.username} 批准资产领用请求")
Exemplo n.º 3
0
def user_edit(request):
    '''  api/user/edit POST
    编辑用户。
    para: name(str), password(str), department_id(str), role([...])
    return: code =
        200: success
        201: parameter error
        202:no such user
    '''
    name, pwd, department_id, roles = parse_args(request.body,
                                                 'name',
                                                 'password',
                                                 'department',
                                                 'role',
                                                 department='')

    if name == 'admin':
        return gen_response(code=203, message="admin 的信息不能被修改")

    user = User.objects.get(username=name)
    if pwd != '':
        user.set_password(pwd)
    try:
        department = Department.objects.get(id=department_id)
    except Department.DoesNotExist:
        department = Department.root()
    user.department = department
    user.save()
    user.set_roles(roles)

    return gen_response(code=200, message=f'{user.username} 信息修改')
Exemplo n.º 4
0
def user_change_password(request):
    ''' api/user/change-password POST
    更改自己的密码。
    para: oldPassword(str), newPassword(str)
    '''
    user = request.user
    old_pwd, new_pwd = parse_args(request.body, 'oldPassword', 'newPassword')

    if not user.check_password(old_pwd):
        return gen_response(message='旧密码错误', code=202)
    user.set_password(new_pwd)
    user.save()
    return gen_response(code=200, message=f'用户 {user.username} 密码更改')
Exemplo n.º 5
0
def category_add(request):
    ''' api/asset/category/add POST
    para: parent_id(int), name(str)
    return: code =
        200: success
    '''
    parent_id, category_name = parse_args(request.body, 'parent_id', 'name')
    parent = AssetCategory.objects.get(id=parent_id)
    try:
        AssetCategory.objects.create(name=category_name, parent=parent)
    except IntegrityError:
        return gen_response(code=203, message="类型名不能重复")
    return gen_response(code=200, message=f'添加资产类别 {category_name}')
Exemplo n.º 6
0
def custom_attr_edit(request):
    ''' api/asset/custom/edit POST
    修改自定义属性
    para:
        - custom(list)
    '''
    attrs = parse_args(request.body, 'custom')[0]
    CustomAttr.objects.all().delete()
    for attr in attrs:
        try:
            CustomAttr.objects.create(name=attr)
        except IntegrityError:
            return gen_response(code=203, message='不能设置两个相同自定义属性')
    return gen_response(code=200, message='修改自定义属性')
Exemplo n.º 7
0
def category_edit(request):
    ''' api/asset/category/edit POST
    para: id(int), name(str)
    return: code =
        200: success
    '''
    category_id, name = parse_args(request.body, 'id', 'name')
    category = AssetCategory.objects.get(id=category_id)

    old_name, category.name = category.name, name
    try:
        category.save()
    except IntegrityError:
        return gen_response(code=203, message="类型名不能重复")
    return gen_response(code=200, message=f'将资产类别 {old_name} 更名为 {name}')
Exemplo n.º 8
0
def asset_list(request):
    '''api/asset/list GET
    return an asset list for asset manager'''
    department = request.user.department
    all_assets = Asset.objects.filter(owner__department=department)
    res = get_assets_list(all_assets)
    return gen_response(code=200, data=res)
Exemplo n.º 9
0
def asset_query(request):
    ''' api/asset/query POST
    para: name(str), category(str), description(str)
    '''
    args = parse_args(request.body,
                      'name',
                      'category',
                      'description',
                      'customKey',
                      'customValue',
                      name='',
                      category='',
                      description='',
                      customKey='',
                      customValue='')
    name, category, description, key, value = args
    assets = Asset.objects.filter(owner__department=request.user.department)
    assets = assets.filter(name__contains=name)
    assets = assets.filter(description__contains=description)
    if category != '':
        category = AssetCategory.objects.get(name=category)
        assets = assets.filter(category=category)
    if key != '':
        assets = AssetCustomAttr.search_custom_attr(key, value, assets)
    res = get_assets_list(assets)
    return gen_response(data=res, code=200)
Exemplo n.º 10
0
def issue_fix(request):
    ''' api/issue/fix POST
    维保资产
    para: nid(int) 资产nid username(str) 维保人名
    '''
    nid, username = parse_args(request.body, 'nid', 'username')
    asset: Asset = Asset.objects.get(id=int(nid))
    if Issue.objects.filter(initiator=request.user,
                            asset=asset,
                            status='DOING').exists():
        return issue_conflict_error()
    handler = User.objects.get(username=username)
    Issue.objects.create(
        initiator=request.user,
        handler=handler,
        asset=asset,
        type_name='MAINTAIN',
    )
    # 更新资产状态
    asset.owner = handler
    asset.status = 'IN_MAINTAIN'
    asset._change_reason = '维保'
    asset.save(tree_update=True)
    message = f'{request.user.username} 向 {handler.username} 维保资产 {asset.name}'
    return gen_response(code=200, message=message)
Exemplo n.º 11
0
def issue_delete(request):
    ''' api/issue/delete POST
    删除issue.
    para:
        nid(int): issue id
        type_name(str): issue类型
    '''
    issue_id, type_name = parse_args(request.body, 'nid', 'type_name')
    if type_name == 'REQUIRE':
        issue: RequireIssue = RequireIssue.objects.get(id=issue_id)
    else:
        issue: Issue = Issue.objects.get(id=issue_id)
    if issue.status != 'DOING':
        return gen_response(code=203, message='已办结的事项不能删除')
    issue.delete()
    return gen_response(code=200, message=f"{request.user.username} 删除待办事项")
Exemplo n.º 12
0
def user_delete(request):
    ''' api/user/delete POST
    删除用户。
    para: name(str)
    return: code =
        200: success
        201: parameter error
        202: no such named user
        203: admin can't be deleted
    '''
    name = parse_args(request.body, 'name')[0]
    if name in ['admin', request.user.username]:
        return gen_response(message='不能删除自己或admin', code=203)
    user = User.objects.get(username=name)
    user.delete()
    return gen_response(code=200, message=f'删除用户 {name}')
Exemplo n.º 13
0
def user_add(request):
    '''  api/user/add POST
    添加用户。
    para: name(str), department(str), role([...])
    return: code =
        200: success
        201: parameter error
        400: Validation Error when saving user
    '''

    name, department_id, roles = parse_args(request.body,
                                            'name',
                                            'department',
                                            'role',
                                            department='')
    try:
        department = Department.objects.get(id=department_id)
    except Department.DoesNotExist:
        department = Department.root()

    user = User(username=name, department=department)
    user.set_password('123456')
    user.full_clean()
    user.save()
    user.set_roles(roles)
    return gen_response(code=200, message=f'添加用户 {name}')
Exemplo n.º 14
0
def category_delete(request):
    ''' api/asset/category/delete POST
    para: id(int)
    return: code =
        200: success
        201: parameter error
        202: 对应部门不存在
        203: 顶层部门不能删除
    '''
    category_id = parse_args(request.body, 'id')[0]

    if int(category_id) == AssetCategory.root().id:
        return gen_response(code=203, message='顶级资产类型不能删除')

    category = AssetCategory.objects.get(id=category_id)
    category.delete()
    return gen_response(code=200, message=f'删除资产类别 {category.name}')
Exemplo n.º 15
0
def user_assets(request):
    ''' api/user/assets GET
    获得自己名下的正在使用的资产列表
    '''
    user = request.user
    assets = Asset.objects.filter(owner=user, status='IN_USE')
    res = get_assets_list(assets)
    return gen_response(data=res, code=200)
Exemplo n.º 16
0
def custom_attr_list(request):
    '''
    api/asset/custom/list GET
    获得自定义属性
    '''
    attrs = CustomAttr.objects.filter()
    res = [attr.name for attr in attrs]
    return gen_response(code=200, data=res)
Exemplo n.º 17
0
def department_delete(request):
    ''' api/department/delete POST
    para: id(int)
    return: code =
        200: success
        201: parameter error
        202: 对应部门不存在
        203: 顶层部门不能删除
    '''
    nid = parse_args(request.body, 'id')[0]

    if int(nid) == Department.root().id:
        return gen_response(code=203, message='顶层部门不能删除')

    department = Department.objects.get(id=nid)
    department.delete()
    return gen_response(code=200, message=f'删除部门 {department.name}')
Exemplo n.º 18
0
def asset_add(request):
    '''  api/asset/add POST
    资产管理员添加资产,需要提供的条目:
    value, name, category, description, parent_id, custom
    return: code =
        200: success
        201: parameter error
        400: Validation Error when saving asset
    '''
    pack_list = parse_list(request.body,
                           'value',
                           'name',
                           'category',
                           'description',
                           'service_life',
                           'parent_id',
                           'custom',
                           description='',
                           service_life=5,
                           parent_id=-1,
                           custom={})

    for pack in pack_list:
        value, name, category, description, service_life, parent_id, custom = pack
        category = AssetCategory.objects.get(name=category)

        try:
            parent: Asset = Asset.objects.get(id=parent_id)
        except Asset.DoesNotExist:
            parent = None
        else:
            if parent.status != 'IDLE':
                return gen_response(code=204, message='只能指定空闲资产为父资产')
        asset = Asset(value=value,
                      name=name,
                      category=category,
                      description=description,
                      owner=request.user,
                      status='IDLE',
                      service_life=service_life,
                      parent=parent)
        asset.full_clean()
        asset.save()
        AssetCustomAttr.update_custom_attrs(asset, custom)
    return gen_response(code=200, message=f'添加资产 {len(pack_list)} 条')
Exemplo n.º 19
0
def user_lock(request):
    ''' api/user/lock POST
    锁定用户
    para: username(str), active(0/1)
    return: code =
        200: success
        201: parameter error
        202:no such user
        203: admin can not be locked
    '''
    username, active = parse_args(request.body, 'username', 'active')
    if username in ['admin', request.user.username]:
        return gen_response(message='不能锁定自己或admin', code=203)
    user = User.objects.get(username=username)

    user.active = active
    user.save()
    return gen_response(code=200)
Exemplo n.º 20
0
def asset_available_list(request):
    '''api/asset/available GET
    返回可以领用(IDLE)的资产
    '''
    department = request.user.department
    all_assets = Asset.objects.filter(owner__department=department,
                                      status='IDLE')
    res = get_assets_list(all_assets)
    return gen_response(code=200, data=res)
Exemplo n.º 21
0
def department_add(request):
    ''' api/department/add POST
    para: parent_id(int), name(str)
    return: code =
        200: success
    '''
    parent_id, name = parse_args(request.body, 'parent_id', 'name')
    parent = Department.objects.get(id=parent_id)
    Department.objects.create(name=name, parent=parent)
    return gen_response(code=200, message=f'添加部门 {name}')
Exemplo n.º 22
0
def handling_list(request):
    ''' api/issue/handling GET
    需要本用户处理的请求列表
    '''
    issues = Issue.objects.filter(handler=request.user, status='DOING')
    res = get_issues_list(issues)
    issues = RequireIssue.objects.filter(handler=request.user, status='DOING')
    res += get_issues_list(issues)
    res.sort(key=lambda issue: issue['start_time'].timestamp())
    return gen_response(code=200, data=res)
Exemplo n.º 23
0
def waiting_list(request):
    ''' api/issue/waiting GET
    本用户已提交的请求列表
    '''
    issues = Issue.objects.filter(initiator=request.user)
    res = get_issues_list(issues)
    issues = RequireIssue.objects.filter(initiator=request.user)
    res += get_issues_list(issues)
    res.sort(key=lambda issue: issue['start_time'].timestamp())
    return gen_response(code=200, data=res)
Exemplo n.º 24
0
def asset_retire(request):
    ''' api/asset/retire POST
    para: nid(int) 资产id, retire_family(bool) 是否清退关联资产
    '''
    nid, retire_family = parse_args(request.body,
                                    'nid',
                                    'retire_family',
                                    retire_family=False)
    asset: Asset = Asset.objects.get(id=int(nid))
    if asset.status != 'IDLE':
        return gen_response(code=203, message='只能清退空闲中的资产')
    asset.status = 'RETIRED'
    asset._change_reason = '清退'
    if retire_family:
        asset.save(tree_update=True)
    else:
        asset.parent = None
        asset.save()
        Asset.objects.filter(parent=asset).update(parent=None)
    return gen_response(code=200, message=f'清退资产 {asset.name}')
Exemplo n.º 25
0
def department_edit(request):
    ''' api/department/edit POST
    para: id(int), name(str)
    return: code =
        200: success
    '''
    nid, name = parse_args(request.body, 'id', 'name')
    department = Department.objects.get(id=nid)

    old_name, department.name = department.name, name
    department.save()
    return gen_response(code=200, message=f'将部门 {old_name} 更名为 {name}')
Exemplo n.º 26
0
def user_exist(request):
    ''' api/user/exist POST
    用户名是否存在。
    para: name(str)
    return: exist(bool), code =
        200: success
        201: parameter error
    '''
    name = parse_args(request.body, 'name')[0]

    exist = User.objects.filter(username=name).exists()
    return gen_response(code=200, exist=exist)
Exemplo n.º 27
0
def require_asset_list(request):
    ''' api/issue/require-asset-list  POST
    同意资产领用时需要的某类空闲中资产列表
    para: category(str)
    '''
    category = parse_args(request.body, 'category')[0]
    category = AssetCategory.objects.get(name=category)
    assets = Asset.objects.filter(owner__department=request.user.department,
                                  status='IDLE',
                                  category=category)
    res = get_assets_list(assets)
    return gen_response(data=res, code=200)
Exemplo n.º 28
0
def user_logout(request):
    '''  api/user/login POST
    用户登出。
    return: status =
        0: success
        1: fall
    '''
    user = request.user
    user.token = ''
    user.save()

    return gen_response(status=0, message=f'{user.username} 登出')
Exemplo n.º 29
0
def asset_allocate(request):
    ''' /api/asset/allocate POST
    调拨资产到请求者(资产管理员)的部门中
    para:  '''
    asset_id_list, department_id = parse_args(request.body, 'idList', 'id')
    department: Department = Department.objects.get(id=department_id)
    target_manager = department.get_asset_manager()
    if target_manager is None:
        return gen_response(code=203, message=f'{department.name} 没有资产管理员')
    assets = set()
    for nid in asset_id_list:
        asset: Asset = Asset.objects.get(id=nid)
        assets.update(asset.get_entire_tree())
    for asset in assets:
        asset.owner = target_manager
        asset._change_reason = '调拨'
        asset.save()
    return gen_response(
        code=200,
        message=f'{request.user.username} 向部门 {department.name} '
        f'调拨 {len(asset_id_list)}资产')
Exemplo n.º 30
0
def asset_history(request):
    ''' api/asset/history POST
    para: nid(int)
    return: code = ...
    data = [
        {time(str), user(str), type(str), info(str)}, ...
    ]
    '''
    nid = parse_args(request.body, 'nid')[0]
    asset = Asset.objects.get(id=nid)
    history = asset.history.all()
    res = [gen_history(record) for record in history]
    return gen_response(code=200, data=res)