<reponame>dreibh/planetlab-lxc-plcapi<gh_stars>0
from PLC.Faults import *
from PLC.Auth import Auth
from PLC.Method import Method
from PLC.Parameter import Parameter, Mixed
from PLC.Sites import Site, Sites
from PLC.Persons import Person, Persons
from PLC.PersonTags import PersonTags, PersonTag
from PLC.Namespace import email_to_hrn
from PLC.TagTypes import TagTypes

from PLC.Logger import logger

class AddPersonToSite(Method):
    """
    Adds the specified person to the specified site. If the person is
    already a member of the site, no errors are returned. Does not
    change the person's primary site.

    Returns 1 if successful, faults otherwise.
    """

    roles = ['admin']

    accepts = [
        Auth(),
        Mixed(Person.fields['person_id'],
              Person.fields['email']),
        Mixed(Site.fields['site_id'],
              Site.fields['login_base'])
        ]

    returns = Parameter(int, '1 if successful')

    def call(self, auth, person_id_or_email, site_id_or_login_base):
        # Get account information
        persons = Persons(self.api, [person_id_or_email])
        if not persons:
            raise PLCInvalidArgument("No such account")
        person = persons[0]

        if person['peer_id'] is not None:
            raise PLCInvalidArgument("Not a local account")

        # Get site information
        sites = Sites(self.api, [site_id_or_login_base])
        if not sites:
            raise PLCInvalidArgument("No such site")
        site = sites[0]

        if site['peer_id'] is not None:
            raise PLCInvalidArgument("Not a local site")

        if site['site_id'] not in person['site_ids']:
            site.add_person(person)

        # Logging variables
        self.event_objects = {'Site': [site['site_id']],
                              'Person': [person['person_id']]}
        self.message = 'Person %d added to site %d' % \
                       (person['person_id'], site['site_id'])

        # maintain person's hrn
        # only if at this point we have a single site 
        # which means, there was no site attached to person upon entering this call
        try:
            had_no_site= (len (person['site_ids']) == 0)
            if had_no_site: 
                login_base = site['login_base']
                root_auth = self.api.config.PLC_HRN_ROOT
                hrn = email_to_hrn("%s.%s"%(root_auth,login_base),person['email'])
                tagname = 'hrn'
                tag_type = TagTypes(self.api,{'tagname':tagname})[0]
                person_tags = PersonTags(self.api,{'tagname':tagname,'person_id':person['person_id']})
                if not person_tags:
                    person_tag = PersonTag(self.api)
                    person_tag['person_id'] = person['person_id']
                    person_tag['tag_type_id'] = tag_type['tag_type_id']
                    person_tag['tagname']  = tagname
                    person_tag['value'] = hrn
                    person_tag.sync()
                else:
                    person_tag = person_tags[0]
                    person_tag['value'] = hrn
                    person_tag.sync() 
        except Exception as e:
            logger.exception("ERROR cannot maintain person's hrn, {}"
                             .format(person_id_or_email))

        return 1

from PLC.Faults import *
from PLC.Auth import Auth
from PLC.Method import Method
from PLC.Parameter import Parameter, Mixed
from PLC.Sites import Site, Sites
from PLC.Persons import Person, Persons
from PLC.PersonTags import PersonTags, PersonTag
from PLC.Namespace import email_to_hrn
from PLC.TagTypes import TagTypes

from PLC.Logger import logger

class AddPersonToSite(Method):
    """
    Adds the specified person to the specified site. If the person is
    already a member of the site, no errors are returned. Does not
    change the person's primary site.

    Returns 1 if successful, faults otherwise.
    """

    roles = ['admin']

    accepts = [
        Auth(),
        Mixed(Person.fields['person_id'],
              Person.fields['email']),
        Mixed(Site.fields['site_id'],
              Site.fields['login_base'])
        ]

    returns = Parameter(int, '1 if successful')

    def call(self, auth, person_id_or_email, site_id_or_login_base):
        # Get account information
        persons = Persons(self.api, [person_id_or_email])
        if not persons:
            raise PLCInvalidArgument("No such account")
        person = persons[0]

        if person['peer_id'] is not None:
            raise PLCInvalidArgument("Not a local account")

        # Get site information
        sites = Sites(self.api, [site_id_or_login_base])
        if not sites:
            raise PLCInvalidArgument("No such site")
        site = sites[0]

        if site['peer_id'] is not None:
            raise PLCInvalidArgument("Not a local site")

        if site['site_id'] not in person['site_ids']:
            site.add_person(person)

        # Logging variables
        self.event_objects = {'Site': [site['site_id']],
                              'Person': [person['person_id']]}
        self.message = 'Person %d added to site %d' % \
                       (person['person_id'], site['site_id'])

        # maintain person's hrn
        # only if at this point we have a single site 
        # which means, there was no site attached to person upon entering this call
        try:
            had_no_site= (len (person['site_ids']) == 0)
            if had_no_site: 
                login_base = site['login_base']
                root_auth = self.api.config.PLC_HRN_ROOT
                hrn = email_to_hrn("%s.%s"%(root_auth,login_base),person['email'])
                tagname = 'hrn'
                tag_type = TagTypes(self.api,{'tagname':tagname})[0]
                person_tags = PersonTags(self.api,{'tagname':tagname,'person_id':person['person_id']})
                if not person_tags:
                    person_tag = PersonTag(self.api)
                    person_tag['person_id'] = person['person_id']
                    person_tag['tag_type_id'] = tag_type['tag_type_id']
                    person_tag['tagname']  = tagname
                    person_tag['value'] = hrn
                    person_tag.sync()
                else:
                    person_tag = person_tags[0]
                    person_tag['value'] = hrn
                    person_tag.sync() 
        except Exception as e:
            logger.exception("ERROR cannot maintain person's hrn, {}"
                             .format(person_id_or_email))

        return 1
Adds the specified person to the specified site. If the person is     already a member of the site, no errors are returned. Does not     change the person's primary site.      Returns 1 if successful, faults otherwise. # Get account information # Get site information # Logging variables # maintain person's hrn # only if at this point we have a single site # which means, there was no site attached to person upon entering this call