gecos-team/gecoscc-ui

View on GitHub
gecoscc/api/groups.py

Summary

Maintainability
A
1 hr
Test Coverage
#
# Copyright 2013, Junta de Andalucia
# http://www.juntadeandalucia.es/
#
# Authors:
#   Antonio Perez-Aranda <ant30tx@gmail.com>
#   Pablo Martin <goinnn@gmail.com>
#
# All rights reserved - EUPL License V 1.1
# https://joinup.ec.europa.eu/software/page/eupl/licence-eupl
#

from cornice.resource import resource

from gecoscc.api import TreeLeafResourcePaginated
from gecoscc.models import Group, Groups
from gecoscc.permissions import api_login_required
from gecoscc.utils import get_filter_nodes_parents_ou, merge_lists


@resource(collection_path='/api/groups/',
          path='/api/groups/{oid}/',
          description='Groups resource',
          validators=(api_login_required,))
class GroupResource(TreeLeafResourcePaginated):

    schema_collection = Groups
    schema_detail = Group
    objtype = 'group'

    mongo_filter = {
        'type': objtype,
    }
    collection_name = 'nodes'

    def get_objects_filter(self):
        filters = super(GroupResource, self).get_objects_filter()

        if 'ou_id' in self.request.GET and 'item_id' in self.request.GET:
            ou_id = self.request.GET['ou_id']
            item_id = self.request.GET['item_id']
            filters += [{'path': get_filter_nodes_parents_ou(self.request.db, ou_id, item_id)}]
        else:
            filters += [{'path': 'none'}]
        return filters

    def remove_relations(self, obj):
        # Remove group from any other group or node where is defined

        # Remove group link from nodes
        self.collection.update_many({
            'memberof': obj[self.key]
        }, {
            '$pull': {
                'memberof': obj[self.key]
            }
        })

    def modify_group_relations(self, obj, old_obj):
        if old_obj is None:
            return
        # Modify parent relation
        merge_lists(self.collection, obj, old_obj, 'memberof', 'nodemembers')

    def modify_node_relations(self, obj, old_obj):
        if old_obj is None:
            return
        merge_lists(self.collection, obj, old_obj, 'nodemembers', 'memberof')

    def post_save(self, obj, old_obj=None):
        if self.request.method == 'DELETE':
            self.remove_relations(obj)
        else:
            self.modify_node_relations(obj, old_obj)
            self.modify_group_relations(obj, old_obj)

        return super(GroupResource, self).post_save(obj, old_obj)