mirror of
https://github.com/MikroWizard/mikroman.git
synced 2025-06-21 12:28:59 +02:00
159 lines
4.6 KiB
Python
159 lines
4.6 KiB
Python
|
#!/usr/bin/python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
# db_group.py: Models and functions for accsessing db related to Device groups
|
||
|
# MikroWizard.com , Mikrotik router management solution
|
||
|
# Author: sepehr.ha@gmail.com
|
||
|
|
||
|
from peewee import *
|
||
|
|
||
|
from libs.db.db import User,BaseModel,get_object_or_none
|
||
|
import logging
|
||
|
from libs.db.db_device import Devices
|
||
|
log = logging.getLogger("db_groups")
|
||
|
|
||
|
|
||
|
class DevGroups(BaseModel):
|
||
|
name = TextField()
|
||
|
owner = ForeignKeyField(db_column='owner', null=True,
|
||
|
model=User, to_field='id')
|
||
|
created = DateTimeField()
|
||
|
modified = DateTimeField()
|
||
|
|
||
|
class Meta:
|
||
|
db_table = 'device_groups'
|
||
|
|
||
|
def get_group(id):
|
||
|
return get_object_or_none(DevGroups, id=id)
|
||
|
|
||
|
class DevGroupRel(BaseModel):
|
||
|
group_id = ForeignKeyField(db_column='group_id', null=True,
|
||
|
model=DevGroups, to_field='id')
|
||
|
device_id = ForeignKeyField(db_column='device_id', null=True,
|
||
|
model=Devices, to_field='id')
|
||
|
class Meta:
|
||
|
# `indexes` is a tuple of 2-tuples, where the 2-tuples are
|
||
|
# a tuple of column names to index and a boolean indicating
|
||
|
# whether the index is unique or not.
|
||
|
db_table = 'device_groups_devices_rel'
|
||
|
indexes = (
|
||
|
# Specify a unique multi-column index on from/to-user.
|
||
|
(('group_id', 'device_id'), True),
|
||
|
)
|
||
|
|
||
|
def create_group(name):
|
||
|
try:
|
||
|
#check if we have a group with same name
|
||
|
group = get_object_or_none(DevGroups,name=name)
|
||
|
#if we do, return id
|
||
|
if group:
|
||
|
return False
|
||
|
group = DevGroups.create(name=name)
|
||
|
except IntegrityError:
|
||
|
return False
|
||
|
return group
|
||
|
|
||
|
def update_group(id, name):
|
||
|
group = get_group(id)
|
||
|
group.name = name
|
||
|
group.save()
|
||
|
return group
|
||
|
|
||
|
def add_devices_to_group(group, devids):
|
||
|
data=[]
|
||
|
for devid in devids:
|
||
|
data.append({'group_id': group, 'device_id': devid})
|
||
|
res=DevGroupRel.insert_many(data).on_conflict_ignore().execute()
|
||
|
return res
|
||
|
|
||
|
#Get groups of device
|
||
|
def devgroups(devid):
|
||
|
return (DevGroups
|
||
|
.select()
|
||
|
.join(DevGroupRel, on=DevGroupRel.group_id)
|
||
|
.where(DevGroupRel.device_id == devid)
|
||
|
.order_by(DevGroups.name))
|
||
|
|
||
|
#Get devices of group
|
||
|
def devs(groupid):
|
||
|
return (Devices
|
||
|
.select()
|
||
|
.join(DevGroupRel, on=DevGroupRel.device_id)
|
||
|
.where(DevGroupRel.group_id == groupid)
|
||
|
.order_by(Devices.name))
|
||
|
|
||
|
#Get groups of device
|
||
|
def devgroups_api(devid):
|
||
|
return list(DevGroups
|
||
|
.select()
|
||
|
.join(DevGroupRel, on=DevGroupRel.group_id)
|
||
|
.where(DevGroupRel.device_id == devid)
|
||
|
.order_by(DevGroups.name).dicts())
|
||
|
|
||
|
#Get devices of group in dict
|
||
|
def devs(groupid):
|
||
|
return list(Devices
|
||
|
.select()
|
||
|
.join(DevGroupRel, on=DevGroupRel.device_id)
|
||
|
.where(DevGroupRel.group_id == groupid)
|
||
|
.order_by(Devices.name).dicts())
|
||
|
|
||
|
#Get devices of group
|
||
|
def devs2(groupid):
|
||
|
return list(Devices
|
||
|
.select()
|
||
|
.join(DevGroupRel, on=DevGroupRel.device_id)
|
||
|
.where(DevGroupRel.group_id == groupid)
|
||
|
.order_by(Devices.name))
|
||
|
def get_devs_of_groups(group_ids):
|
||
|
try:
|
||
|
return list(Devices
|
||
|
.select()
|
||
|
.join(DevGroupRel, on=DevGroupRel.device_id)
|
||
|
.where(DevGroupRel.group_id << group_ids)
|
||
|
.order_by(Devices.name))
|
||
|
except Exception as e :
|
||
|
log.error(e)
|
||
|
return []
|
||
|
|
||
|
#get all groups including devices in each group
|
||
|
def query_groups_api():
|
||
|
t3=DevGroups.alias()
|
||
|
q=DevGroups.select(DevGroups.id,DevGroups.name,DevGroups.created,fn.array_agg(DevGroupRel.device_id)).join(DevGroupRel,JOIN.LEFT_OUTER, on=(DevGroupRel.group_id == DevGroups.id)).order_by(DevGroups.id).group_by(DevGroups.id)
|
||
|
return list(q.dicts())
|
||
|
|
||
|
def get_groups_by_id(ids):
|
||
|
"""Return list of unique directors. An example of a raw SQL query."""
|
||
|
q=DevGroups.select().where(DevGroups.id << ids)
|
||
|
try:
|
||
|
q=list(q)
|
||
|
except Exception as e :
|
||
|
log.error(e)
|
||
|
q=False
|
||
|
return q
|
||
|
|
||
|
def delete_from_group(devids):
|
||
|
delete=DevGroupRel.delete().where(DevGroupRel.device_id << devids).execute()
|
||
|
return delete
|
||
|
|
||
|
def delete_device(devid):
|
||
|
try:
|
||
|
|
||
|
delete_from_group([devid])
|
||
|
dev = get_object_or_none(Devices, id=devid)
|
||
|
dev.delete_instance(recursive=True)
|
||
|
return True
|
||
|
except Exception as e:
|
||
|
log.error(e)
|
||
|
return False
|
||
|
|
||
|
|
||
|
# --------------------------------------------------------------------------
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
|
||
|
# quick adhoc tests
|
||
|
logging.basicConfig(level=logging.DEBUG)
|
||
|
|
||
|
|