MikroWizard.mikroman/py/libs/db/db_groups.py

159 lines
4.6 KiB
Python
Raw Normal View History

#!/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)