コード例 #1
0
ファイル: actions.py プロジェクト: civicboom/civicboom
def del_group(group):
    group = get_group(group)
    from pylons import tmpl_context as c
    for member in [member_role.member for member_role in group.members_roles]:
        member.send_notification(
            messages.group_deleted(group=group, admin=c.logged_in_user)
        )  # AllanC - We cant use the standard group.send_notification because the group wont exisit after this line!
    Session.delete(group)
    Session.commit()
コード例 #2
0
ファイル: actions.py プロジェクト: civicboom/civicboom
def set_role(group, member, role, delay_commit=False):
    group = get_group(group)
    member = get_member(member)
    membership = get_membership(group, member)
    role = role or membership.role or group.default_role

    if not group:
        raise action_error(_('unable to find group'), code=404)
    if not member:
        raise action_error(_('unable to find member'), code=404)
    if not membership:
        raise action_error(_('not a member of group'), code=400)
    if role not in group_member_roles.enums:
        raise action_error('not a valid role', code=400)
    # AllanC - permisions moved to controller
    #if not group.is_admin(c.logged_in_persona):
    #    raise action_error(_('no permissions for this group'), 403)
    # AllanC - integrtiy moved to model
    #if membership.role=="admin" and num_admins<=1:
    #    raise action_error('cannot remove last admin', 400)

    from pylons import tmpl_context as c
    membership.role = role
    if membership.status == "request":
        membership.status = "active"
        member.send_notification(
            messages.group_request_accepted(admin=c.logged_in_user,
                                            group=group,
                                            you=member))
        group.send_notification(
            messages.group_new_member(member=member, group=group))
    else:
        group.send_notification(
            messages.group_role_changed(admin=c.logged_in_user,
                                        member=member,
                                        group=group,
                                        role=role))

    if not delay_commit:
        Session.commit()

    #invalidate_member(group)
    #invalidate_member(member)

    return True
コード例 #3
0
ファイル: actions.py プロジェクト: civicboom/civicboom
def remove_member(group, member, delay_commit=False):
    group = get_group(group)
    member = get_member(member)
    membership = get_membership(group, member)

    if not group:
        raise action_error(_('unable to find group'), code=404)
    if not member:
        raise action_error(_('unable to find member'), code=404)
    if not membership:
        raise action_error(_('not a member of group'), code=400)
    # AllanC - permissions moved to controller
    #if member!=c.logged_in_persona and not group.is_admin(c.logged_in_persona):
    #    raise action_error('current user has no permissions for this group', 403)
    #AllanC - integrety moved to model
    #if membership.role=="admin" and num_admins<=1:
    #    raise action_error('cannot remove last admin', 400)

    # Notifications
    if membership.status == "active":  # member removed
        from pylons import tmpl_context as c
        if member != c.logged_in_user:
            membership.member.send_notification(
                messages.group_remove_member_to_member(admin=c.logged_in_user,
                                                       group=group))
        group.send_notification(
            messages.group_remove_member_to_group(admin=c.logged_in_user,
                                                  group=group,
                                                  member=member))
    elif membership.status == "invite":  # invitation declined
        group.send_notification(
            messages.group_invitation_declined(member=member, group=group))
    elif membership.status == "request":  # request declined
        membership.member.send_notification(
            messages.group_request_declined(group=group))

    Session.delete(membership)

    if not delay_commit:
        Session.commit()

    #invalidate_member(group)
    #invalidate_member(member)

    return True
コード例 #4
0
ファイル: actions.py プロジェクト: civicboom/civicboom
def join_group(group, member, delay_commit=False):
    return_value = True

    group = get_group(group)
    member = get_member(member)
    membership = get_membership(group, member)

    if not group:
        raise action_error(_('unable to find group'), code=404)
    if not member:
        raise action_error(_('unable to find member to add'), code=404)
    # AllanC - join permissions moved to controller

    if membership and membership.status == "invite":
        membership.status = "active"
    else:
        membership = GroupMembership()
        membership.group = group
        membership.member = member
        membership.role = group.default_role
        group.members_roles.append(membership)

        # If a join request
        if group.join_mode == "invite_and_request":
            membership.status = "request"
            return_value = "request"
            group.send_notification(
                messages.group_join_request(member=member, group=group))

    # If user has actually become a member (open or reply to invite) then notify group
    if return_value == True:
        group.send_notification(
            messages.group_new_member(member=member, group=group))

    if not delay_commit:
        Session.commit()

    #invalidate_member(group)
    #invalidate_member(member)

    return return_value
コード例 #5
0
ファイル: actions.py プロジェクト: civicboom/civicboom
def invite(group, member, role, delay_commit=False):
    group = get_group(group)
    member = get_member(member)
    membership = get_membership(group, member)
    role = role or group.default_role

    if not group:
        raise action_error(_('unable to find group'), code=404)
    if not member:
        raise action_error(_('unable to find member'), code=404)
    if membership:
        raise action_error(_('already a member of group'), code=400)
    if role not in group_member_roles.enums:
        raise action_error('not a valid role', code=400)
    # AllanC - permissions moved to controller
    #if not group.is_admin(c.logged_in_persona):
    #    raise action_error(_('no permissions for this group'), 403)

    membership = GroupMembership()
    membership.group = group
    membership.member = member
    membership.role = role
    membership.status = "invite"
    group.members_roles.append(membership)

    # Notification of invitation
    from pylons import tmpl_context as c
    member.send_notification(
        messages.group_invite(admin=c.logged_in_user,
                              group=group,
                              role=membership.role,
                              you=member))

    if not delay_commit:
        Session.commit()

    #invalidate_member(group)
    #invalidate_member(member)

    return True
コード例 #6
0
    def test_delete_user(self):

        self.assertEqual(self.num_members_public(username='******'), 0)
        self.assertEqual(self.num_content_public('delete_cascade'), 0)

        num_members_start = self.num_members_public()
        num_content_start = self.num_content_public()

        #-----------------------------------------------------------------------
        # Step 1: Create a set of interlinked objects over a range of tables to test delete cascades
        #-----------------------------------------------------------------------

        # Create user
        self.sign_up_as('delete_cascade')

        response = self.app.get(url('member',
                                    id='delete_cascade',
                                    format='json'),
                                status=200)
        response_json = json.loads(response.body)
        self.delete_cascade_member_id = response_json['data']['member']['id']
        self.assertNotEqual(self.delete_cascade_member_id, 0)

        self.assertEqual(self.num_members_public(), num_members_start + 1)

        # Setup known objects for delete cascade - Create a record in every related table to 'delete_cascade' member
        # when searching through the database after the deletion has occoured there should be NO trace of the string 'delete_cascade' anywhere!
        #  - follow
        #  - messages
        #  - content
        #  - group membership

        # Create content with media
        self.png1x1 = self.generate_image((1, 1))
        response = self.app.post(
            url('contents', format='json'),
            params={
                '_authentication_token': self.auth_token,
                'title': u'Testing delete_cascade',
                'contents': u'delete_cascade delete_cascade',
                'type': u'assignment',
                'tags_string': u'delete_cascade',
                #'submit_publish': u'publish' ,
            },
            upload_files=[("media_file", "1x1.png", self.png1x1)],
            status=201)
        response_json = json.loads(response.body)
        self.content_id = int(response_json['data']['id'])
        self.assertNotEqual(self.content_id, 0)
        response = self.app.get(url('content',
                                    id=self.content_id,
                                    format='json'),
                                status=200)
        response_json = json.loads(response.body)
        self.media_id = response_json['data']['content']['attachments'][0][
            'id']
        self.assertNotEqual(self.media_id, 0)

        # record current number of
        response = self.app.get(url('member', id='unittest', format='json'),
                                status=200)
        response_json = json.loads(response.body)
        num_following = response_json['data']['following']['count']
        num_followers = response_json['data']['followers']['count']
        num_boomed_content = response_json['data']['boomed']['count']
        #num_sent_messages =

        # Following, message recive, boom, comment
        self.log_in_as('unittest')
        self.follow('delete_cascade')
        self.send_member_message(
            'delete_cascade', 'testing delete_cascade',
            'this message should never be seen as it part of the delete_cascade test'
        )
        self.boom_content(self.content_id)
        self.comment(self.content_id, 'delete_cascade comment')
        unittest_assingment_id = self.create_content(type='assignment',
                                                     title='assignment',
                                                     content='assignment')

        # Follow, message send, comment
        self.log_in_as('delete_cascade')
        self.follow('unittest')
        self.send_member_message(
            'unittest', 'testing delete_cascade',
            'this message should never be seen as it part of the delete_cascade test'
        )
        self.comment(self.content_id, 'delete_cascade comment')
        # TODO: accept assignment by unittest
        self.accept_assignment(unittest_assingment_id)
        self.withdraw_assignment(unittest_assingment_id)

        response = self.app.get(url('member', id='unittest', format='json'),
                                status=200)
        response_json = json.loads(response.body)
        self.assertEqual(num_following + 1,
                         response_json['data']['following']['count'])
        self.assertEqual(num_followers + 1,
                         response_json['data']['followers']['count'])
        self.assertEqual(num_boomed_content + 1,
                         response_json['data']['boomed']['count'])

        # Create group - and therefor become a member
        self.group_id = self.create_group(
            username='******',
            name='Test group for delete_cascade',
            description=
            'This group should not be visible once the tests have completed because it will be removed',
            default_role='contributor',
            join_mode='public',
            member_visibility='public',
            default_content_visibility='public',
        )

        self.set_account_type(
            'plus')  # Create an account record associated with this user
        self.delete_cascade_payment_account_id = Session.query(
            Member).filter_by(id=self.delete_cascade_member_id).one(
            ).payment_account_id  # Get payment account id

        #-----------------------------------------------------------------------
        # Step 2: check data is in database
        #-----------------------------------------------------------------------
        # check tables deeply for all instances of the member id for removal

        self.assertEqual(
            self.num_members_public(username='******'), 1
        )  # 'delete_cascade' and 'delete_cascade_group' are both public members
        self.assertEqual(
            self.num_members_public(username='******'), 1)
        self.assertEqual(
            self.num_content_public('delete_cascade'), 1
        )  # 'delete_cascade' in public content # unittest assignment has delete cascade in title and content

        self.assertEqual(
            Session.query(Media).filter_by(id=self.media_id).count(), 1)
        self.assertEqual(
            Session.query(Content).filter_by(id=self.content_id).count(), 1)
        self.assertEqual(
            Session.query(Content).filter_by(
                parent_id=self.content_id).count(), 2)
        self.assertEqual(
            Session.query(Boom).filter_by(content_id=self.content_id).count(),
            1)

        self.assertEqual(
            Session.query(Member).filter_by(
                id=self.delete_cascade_member_id).count(), 1)
        #self.assertEqual(Session.query(Boom            ).filter_by(  member_id = self.delete_cascade_member_id).count(), 1) # The boom didnt come from the member 'delete_cascade'
        self.assertEqual(
            Session.query(GroupMembership).filter_by(
                member_id=self.delete_cascade_member_id).count(), 1)
        self.assertEqual(
            Session.query(Follow).filter_by(
                member_id=self.delete_cascade_member_id).count(), 1)
        self.assertEqual(
            Session.query(Follow).filter_by(
                follower_id=self.delete_cascade_member_id).count(), 1)
        self.assertEqual(
            Session.query(MemberAssignment).filter_by(
                member_id=self.delete_cascade_member_id).count(), 1)

        #self.assertEqual(Session.query(Message         ).filter_by(  target_id = self.delete_cascade_member_id).count() == 1) # cant, 1 as notifications are generated and it is more than 1
        self.assertEqual(
            Session.query(Message).filter_by(
                source_id=self.delete_cascade_member_id).count(), 1)

        self.assertEqual(
            Session.query(Tag).filter_by(name=u'delete_cascade').count(), 1)

        self.assertEqual(
            Session.query(Member).filter_by(
                payment_account_id=self.delete_cascade_payment_account_id).
            count(), 1)

        #-----------------------------------------------------------------------
        # Step 3: Delete objects
        #-----------------------------------------------------------------------

        member_delete_cascade = get_member('delete_cascade')
        member_delete_cascade.delete()

        group_delete_cascade = get_group('delete_cascade_group')
        self.assertEqual(group_delete_cascade.num_members, 0)
        group_delete_cascade.delete()

        #-----------------------------------------------------------------------
        # Step 4: Check for successful removal
        #-----------------------------------------------------------------------

        self.assertEqual(self.num_members_public(username='******'), 0)
        self.assertEqual(
            self.num_members_public(username='******'), 0)
        self.assertEqual(self.num_content_public('delete_cascade'), 0)
        self.assertEqual(num_members_start, self.num_members_public())
        self.assertEqual(num_content_start,
                         self.num_content_public() -
                         1)  # -1 because unittest set an assignment

        # check current number of
        response = self.app.get(url('member', id='unittest', format='json'),
                                status=200)
        response_json = json.loads(response.body)
        self.assertEqual(num_following,
                         response_json['data']['following']['count'])
        self.assertEqual(num_followers,
                         response_json['data']['followers']['count'])
        self.assertEqual(num_boomed_content,
                         response_json['data']['boomed']['count'])

        # check tables deeply for all instances of the member id for removal
        self.assertEqual(
            Session.query(Media).filter_by(id=self.media_id).count(), 0)
        self.assertEqual(
            Session.query(Content).filter_by(id=self.content_id).count(), 0)
        self.assertEqual(
            Session.query(Content).filter_by(
                parent_id=self.content_id).count(), 0)
        self.assertEqual(
            Session.query(Boom).filter_by(content_id=self.content_id).count(),
            0)

        self.assertEqual(
            Session.query(Member).filter_by(
                id=self.delete_cascade_member_id).count(), 0)
        self.assertEqual(
            Session.query(Boom).filter_by(
                member_id=self.delete_cascade_member_id).count(), 0)
        self.assertEqual(
            Session.query(GroupMembership).filter_by(
                member_id=self.delete_cascade_member_id).count(), 0)
        self.assertEqual(
            Session.query(Follow).filter_by(
                member_id=self.delete_cascade_member_id).count(), 0)
        self.assertEqual(
            Session.query(Follow).filter_by(
                follower_id=self.delete_cascade_member_id).count(), 0)
        self.assertEqual(
            Session.query(MemberAssignment).filter_by(
                member_id=self.delete_cascade_member_id).count(), 0)

        self.assertEqual(
            Session.query(Message).filter_by(
                target_id=self.delete_cascade_member_id).count(), 0)
        self.assertEqual(
            Session.query(Message).filter_by(
                source_id=self.delete_cascade_member_id).count(), 0)

        self.assertEqual(
            Session.query(Tag).filter_by(name=u'delete_cascade').count(), 1
        )  #Tag remains at the end, this could be tidyed witha  delete orphan cascade

        self.assertEqual(
            Session.query(Member).filter_by(
                payment_account_id=self.delete_cascade_payment_account_id).
            count(), 0)
        self.assertEqual(
            Session.query(PaymentAccount).filter_by(
                id=self.delete_cascade_payment_account_id).count(),
            1)  # The cascade dose not remove the payment account

        # Step 5: cleanup
        unittest_assignment = get_content(unittest_assingment_id)
        unittest_assignment.delete()