Ejemplo n.º 1
0
    def getProfile(self, id, user):
        from girderformindlogger.models.applet import Applet as AppletModel
        from girderformindlogger.models.ID_code import IDCode
        from bson.errors import InvalidId

        if not isinstance(id, ObjectId):
            try:
                id = ObjectId(id)
            except InvalidId:
                p = None
        if isinstance(id, ObjectId):
            p = self.findOne({'_id': id})
        if p is None:
            ps = IDCode().findProfile(id)
            if ps is not None:
                ps = [self.profileAsUser(p, user) for p in ps if p is not None]
                return (ps[0] if len(ps) == 1 and ps[0] is not None else ps)
            else:
                from girderformindlogger.models.invitation import Invitation
                from girderformindlogger.utility.jsonld_expander import        \
                    oidIffHex
                inv = Invitation().findOne(
                    {'$or': [{
                        '_id': {
                            '$in': oidIffHex(id)
                        }
                    }, {
                        'idCode': id
                    }]})
                return (self.profileAsUser(inv, user)
                        if isinstance(inv, dict) else {})
        return (self.profileAsUser(self.load(p['_id'], force=True), user))
def inferRelationships(person):
    from girderformindlogger.models.invitation import Invitation
    from girderformindlogger.models.profile import Profile

    if "schema:knows" not in person:
        return (person)
    start = deepcopy(person)
    for rel in list(person['schema:knows'].keys()):
        if rel in DEFINED_RELATIONS.keys():
            if "owl:equivalentProperty" in DEFINED_RELATIONS[rel]:
                for ep in DEFINED_RELATIONS[rel]["owl:equivalentProperty"]:
                    if ep not in person['schema:knows']:
                        person['schema:knows'][ep] = []
                    for related in person['schema:knows'][rel]:
                        if related not in person['schema:knows'][ep]:
                            person['schema:knows'][ep].append(related)
    if any([
            bool(rp not in start.get('schema:knows', {}).get(rel, []))
            for rp in person['schema:knows'][rel]
            for rel in list(person['schema:knows'].keys())
    ]):
        newPerson = Profile().load(person['_id'], force=True)
        if 'schema:knows' in newPerson:
            newPerson['schema:knows'].update(person['schema:knows'])
        else:
            newPerson['schema:knows'] = person['schema:knows']
        Profile().save(
            newPerson,
            validate=False) if 'userId' in newPerson else Invitation().save(
                newPerson, validate=False)
    return (person)
Ejemplo n.º 3
0
    def setUserRelationship(self, id, rel, otherId, otherName):
        from girderformindlogger.models.invitation import Invitation
        from girderformindlogger.utility.jsonld_expander import                \
            inferRelationships, oidIffHex

        user = self.getCurrentUser()
        grammaticalSubject = ProfileModel().getProfile(id, user)
        gsp = ProfileModel().load(
            grammaticalSubject['_id'],
            force=True
        )
        grammaticalSubject = Invitation().load(
            grammaticalSubject['_id'],
            force=True
        ) if gsp is None else gsp
        print(grammaticalSubject)
        if grammaticalSubject is None or not AppletModel().isCoordinator(
            grammaticalSubject['appletId'], user
        ):
            raise AccessException(
                'You do not have permission to update this user.'
            )

        appletId = grammaticalSubject['appletId']
        grammaticalObject = ProfileModel().getSubjectProfile(
            otherId,
            otherName,
            user
        )
        if grammaticalObject is None:
            grammaticalObject = ProfileModel().getProfile(
                ProfileModel().createPassiveProfile(
                    appletId,
                    otherId,
                    otherName,
                    user
                )['_id'],
                grammaticalSubject
            )
        if 'schema:knows' in grammaticalSubject:
            if rel in grammaticalSubject['schema:knows'] and grammaticalObject[
                '_id'
            ] not in grammaticalSubject['schema:knows'][rel]:
                grammaticalSubject['schema:knows'][rel].append(
                    grammaticalObject['_id']
                )
            else:
                grammaticalSubject['schema:knows'][rel] = [
                    grammaticalObject['_id']
                ]
        else:
            grammaticalSubject['schema:knows'] = {
                rel: [grammaticalObject['_id']]
            }
        ProfileModel().save(grammaticalSubject, validate=False)
        inferRelationships(grammaticalSubject)
        return(ProfileModel().getProfile(id, user))
Ejemplo n.º 4
0
    def invite(self, applet, role="user", idCode=None, profile=None):
        from girderformindlogger.models.invitation import Invitation
        from girderformindlogger.models.profile import Profile

        user = self.getCurrentUser()
        try:
            if role not in USER_ROLE_KEYS:
                raise ValidationException('Invalid role.', 'role')

            invitation = Invitation().createInvitation(applet=applet,
                                                       coordinator=user,
                                                       role=role,
                                                       profile=profile,
                                                       idCode=idCode)

            return (Profile().displayProfileFields(invitation, user))
        except:
            import sys, traceback
            print(sys.exc_info())
Ejemplo n.º 5
0
 def findProfile(self, idCode):
     """
     Find a list of profiles for a given ID code.
     """
     existing = list(self.find({'code': idCode}))
     if len(existing):
         from girderformindlogger.models.profile import Profile
         ps = [
             Profile().load(exist['profileId'], force=True)
             for exist in existing
         ]
         if len(ps):
             return (ps)
     else:
         from girderformindlogger.models.invitation import Invitation
         existing = list(self.find({'idCode': idCode}))
         ps = [
             Invitation().load(exist['_id'], force=True)
             for exist in existing
         ]
         if len(ps):
             return (ps)
     return (None)
Ejemplo n.º 6
0
def inviteUserToApplet(user, appletObject, userB):
    """
    invite a user to an applet

    inputs
    ------
    user: a user object
    appletObject:
    userB: a user object of a user you want to invite. If they aren't
    defined yet, it should be a dict(email="emailaddress")
    """

    groupId = appletObject['roles']['user']['groups'][0]['id']
    currentUser = authenticate(user)
    group = Group().load(id=ObjectId(groupId), force=True)

    invitation = Invitation().createInvitation(appletObject,
                                               currentUser,
                                               role="user",
                                               profile=Profile().createProfile(
                                                   appletObject, userB),
                                               idCode=None)
    return Group().inviteUser(group, userB, level=AccessType.READ)
Ejemplo n.º 7
0
    def inviteUser(self,
                   applet,
                   role="user",
                   email='',
                   firstName='',
                   lastName='',
                   MRN=''):
        from girderformindlogger.models.invitation import Invitation
        from girderformindlogger.models.profile import Profile

        if not mail_utils.validateEmailAddress(email):
            raise ValidationException('invalid email', 'email')

        thisUser = self.getCurrentUser()

        encryptedEmail = UserModel().hash(email)
        invitedUser = UserModel().findOne({
            'email': encryptedEmail,
            'email_encrypted': True
        })

        if not invitedUser:
            invitedUser = UserModel().findOne({
                'email': email,
                'email_encrypted': {
                    '$ne': True
                }
            })

        if not AppletModel().isCoordinator(applet['_id'], thisUser):
            raise AccessException(
                "Only coordinators and managers can invite users.")

        if role not in USER_ROLE_KEYS:
            raise ValidationException('Invalid role.', 'role')

        invitation = Invitation().createInvitationForSpecifiedUser(
            applet=applet,
            coordinator=thisUser,
            role=role,
            user=invitedUser,
            firstName=firstName,
            lastName=lastName,
            MRN=MRN,
            userEmail=encryptedEmail)

        url = 'web.mindlogger.org/#/invitation/%s' % (str(invitation['_id'], ))

        managers = mail_utils.htmlUserList(AppletModel().listUsers(applet,
                                                                   'manager',
                                                                   force=True))
        coordinators = mail_utils.htmlUserList(AppletModel().listUsers(
            applet, 'coordinator', force=True))
        reviewers = mail_utils.htmlUserList(AppletModel().listUsers(
            applet, 'reviewer', force=True))

        html = mail_utils.renderTemplate(
            'userInvite.mako'
            if invitedUser else 'inviteUserWithoutAccount.mako', {
                'url': url,
                'userName': firstName,
                'coordinatorName': thisUser['firstName'],
                'appletName': applet['displayName'],
                'MRN': MRN,
                'managers': managers,
                'coordinators': coordinators,
                'reviewers': reviewers
            })

        mail_utils.sendMail('invitation for an applet', html, [email])

        return 'sent invitation mail to {}'.format(email)
    def getAppletUsers(self, applet, user=None, force=False):
        """
        Function to return a list of Applet Users

        :param applet: Applet to get users for.
        :type applet: dict
        :param user: User making request
        :type user: dict
        :returns: list of dicts
        """
        from girderformindlogger.models.invitation import Invitation
        from girderformindlogger.models.profile import Profile

        profileFields = ["_id", "coordinatorDefined", "userDefined"]

        try:

            if not isinstance(user, dict):
                user = UserModel().load(
                    id=user, level=AccessType.READ, force=True) if isinstance(
                        user, str) else {}

            if not force:
                if not self.isCoordinator(applet.get('_id', applet), user):
                    return ([])

            profileModel = Profile()
            userDict = {
                'active': [{
                    **profileModel.displayProfileFields(p,
                                                        user,
                                                        forceManager=True), 'userId':
                    p['userId']
                } for p in list(
                    profileModel.find(
                        query={
                            'appletId': applet['_id'],
                            'userId': {
                                '$exists': True
                            },
                            'profile': True
                        }))],
                'pending': []
            }

            for p in list(
                    Invitation().find(query={'appletId': applet['_id']})):
                profile = profileModel.findOne(query={'_id': p['_id']})
                userDict['pending'].append(
                    profileModel.displayProfileFields(
                        profile, user, forceManager=True) if profile else {
                            '_id': p['_id'],
                            'invitedBy': p['invitedBy'],
                        })

            missing = threading.Thread(target=profileModel.generateMissing,
                                       args=(applet, ))
            missing.start()

            if len(userDict['active']):
                return (userDict)

            else:
                return ({**userDict, "message": "cache updating"})
        except:
            import sys, traceback
            print(sys.exc_info())
            return ({traceback.print_tb(sys.exc_info()[2])})