Пример #1
0
    def submit_success(self, appstruct):
        user = User(
            email=appstruct.get('email'),
            fullname=appstruct.get('fullname'),
            affiliate=appstruct.get('affiliate'),
            billing_email=appstruct.get('billing_email'),
            valid_to=appstruct.get('valid_to'),
            last_payment=appstruct.get('last_payment'),
            groups=[Group.by_id(group_id) for group_id in appstruct.get('groups', [])],  # noqa
            properties=[UserProperty(key=prop.get('key'), value=prop.get('value'))  # noqa
                        for prop in appstruct.get('properties', [])],
        )

        if appstruct.get('password'):  # pragma: no branch
            user.password = encrypt(appstruct['password'])

        Session.add(user)
        Session.flush()
        self.request.registry.notify(
            UserCreated(
                self.request,
                user,
                appstruct.get('password'),
                u'Created manually by {}'.format(self.request.user.email)
            )
        )
        self.request.session.flash(u'User "{}" added.'.format(user.email))
        return HTTPFound(
            location=self.request.route_path('user_view', user_id=user.id))
Пример #2
0
    def test_save_success(self):
        self.request.context = User.by_id(2)

        # add a property that will get updated on save_success()
        self.request.context.set_property(key=u'foo', value=u'var')

        result = self.view.save_success(self.APPSTRUCT)
        self.assertIsInstance(result, HTTPFound)
        self.assertEqual(result.location, '/user/2/')

        user = User.by_id(2)
        self.assertEqual(user.email, '*****@*****.**')
        self.assertTrue(verify('new_secret', user.password))
        self.assertEqual(user.fullname, u'Foö Bar')
        self.assertEqual(user.affiliate, u'Aff')
        self.assertEqual(user.billing_email, '*****@*****.**')
        self.assertEqual(user.valid_to, date(2014, 2, 1))
        self.assertEqual(user.last_payment, date(2014, 1, 1))
        self.assertEqual(user.groups,
                         [Group.by_id(1), Group.by_id(3)
                          ])  # enabled user stays enabled  # noqa
        self.assertEqual(user.get_property('foo'), 'bar')
        self.assertEqual(user.get_property('baz'), 'bam')
        self.assertEqual(user.get_property('empty'), None)
        with self.assertRaises(KeyError):
            user.get_property('bimt')  # removed property

        self.assertEqual(
            self.request.session.pop_flash(),
            [u'User "*****@*****.**" modified.'],
        )
Пример #3
0
 def test_addon_group(self):
     User.by_email('*****@*****.**').groups = [
         _make_group(name='foo', product_id='foo'),
         _make_group(name='bar', product_id='bar', addon=True),
     ]
     self.assertEqual(
         User.by_email('*****@*****.**').product_group.name, 'foo')
Пример #4
0
    def setUp(self):
        from pyramid_bimt.views import DatatablesDataView
        from pyramid_bimt.models import AuditLogEntry
        from pyramid_bimt.models import User

        self.config = testing.setUp()
        initTestingDB(auditlog_types=True, users=True, groups=True)
        self.request = testing.DummyRequest(user=User.by_email('*****@*****.**'))
        self.view = DatatablesDataView(self.request)

        self.view.model = mock.Mock()
        self.view.columns = OrderedDict()
        self.view.columns['foo'] = None
        self.view.columns['bar'] = None

        Session.add(
            AuditLogEntry(user=User.by_email('*****@*****.**'), comment=u'föo'))
        Session.add(
            AuditLogEntry(user=User.by_email('*****@*****.**'), comment=u'bar'))
        Session.flush()

        class DummyDatatablesAJAXView(DatatablesDataView):

            model = AuditLogEntry

            columns = OrderedDict()
            columns['id'] = None
            columns['comment'] = None

            def populate_columns(self, entry):
                self.columns['id'] = entry.id
                self.columns['comment'] = entry.comment
                self.columns['DT_RowClass'] = 'info'

        self.datatable_view = DummyDatatablesAJAXView
Пример #5
0
    def ipn(self):
        """The main IPN handler, called by the IPN service."""
        # skip over to-be-ignored products
        if self.params.product_id in self.request.registry.settings.get(
                'bimt.products_to_ignore', '').split(','):
            logger.info('The product is listed on the ignore list: {}'.format(
                self.params.product_id))
            return 'Done.'

        # try to find an existing user with given email
        user = User.by_email(self.params.email)
        if not user:
            user = User.by_billing_email(self.params.email)

        # create a new user if no existing user found
        if not user:
            password = generate()
            user = User(
                email=self.params.email,
                billing_email=self.params.email,
                password=encrypt(password),
                fullname=u'{}'.format(self.params.fullname),
                affiliate=u'{}'.format(self.params.get('affiliate', '')),
            )
            Session.add(user)

            comment = COMMENT.format(
                u'Created',
                self.provider,
                self.params.trans_id,
                self.params.trans_type,
                '',
            )
            logger.info(comment)
            self.request.registry.notify(
                UserCreated(self.request, user, password, comment))

        # find a group that is used for given product
        group = Group.by_product_id(self.params.product_id)
        if not group:
            raise ValueError('Cannot find group with product_id "{}"'.format(
                self.params.product_id))

        # perform IPN transaction actions
        self.ipn_transaction(user, group)

        # send request with same parameters to the URL specified on group
        if group.forward_ipn_to_url:
            requests.post(
                group.forward_ipn_to_url,
                params=self.request.POST,
            )
            logger.info('IPN re-posted to {}.'.format(
                group.forward_ipn_to_url))

        logger.info('IPN done.')
        return 'Done.'
Пример #6
0
    def test_multiple_product_groups(self):
        product_group_foo = _make_group(name='foo', product_id='foo')
        product_group_bar = _make_group(name='bar', product_id='bar')
        product_group_foo.users.append(User.by_email('*****@*****.**'))
        product_group_bar.users.append(User.by_email('*****@*****.**'))

        from sqlalchemy.orm.exc import MultipleResultsFound
        with self.assertRaises(MultipleResultsFound):
            User.by_email('*****@*****.**').product_group
Пример #7
0
    def setUp(self):
        self.config = testing.setUp()
        add_routes_user(self.config)
        initTestingDB(users=True, groups=True, auditlog_types=True)

        from pyramid_bimt.views.user import UserView
        self.context = User.by_email('*****@*****.**')
        self.request = testing.DummyRequest(
            layout_manager=mock.Mock(), user=User.by_email('*****@*****.**'))
        self.view = UserView(self.context, self.request)
Пример #8
0
    def test_admin_mark_only_own_entries_as_unread(self):
        self.request.user = User.by_email('*****@*****.**')

        AuditLogEntry.by_id(2).user = User.by_email('*****@*****.**')
        AuditLogEntry.by_id(2).read = False
        self._make_view()
        self.assertEqual(AuditLogEntry.by_id(2).read, True)

        AuditLogEntry.by_id(2).user = User.by_email('*****@*****.**')
        AuditLogEntry.by_id(2).read = False
        self._make_view()
        self.assertEqual(AuditLogEntry.by_id(2).read, False)
Пример #9
0
    def test_api_key_set_on_user_creation(self, mocked_generate):
        mocked_generate.return_value = 'foo'

        from pyramid_bimt.events import UserCreated

        user = User(email='*****@*****.**')
        Session.add(user)

        request = testing.DummyRequest()
        request.registry.notify(UserCreated(request, user, u'foö'))

        self.assertEqual(user.get_property('api_key', secure=True), u'foo')
Пример #10
0
 def test_search_fullname_case_insensitive(self):
     _make_user(email='*****@*****.**', fullname=u'AAAAA')
     _make_user(email='*****@*****.**', fullname=u'aaaaa')
     _make_user(email='*****@*****.**', fullname=u'BBBBB')
     _make_user(email='*****@*****.**', fullname=u'bbbbb')
     users = User.get_all(search='aaaaa').all()
     self.assertEqual(len(users), 2)
     self.assertEqual(users[0].email, '*****@*****.**')
     self.assertEqual(users[1].email, '*****@*****.**')
     users = User.get_all(search='AAAAA').all()
     self.assertEqual(len(users), 2)
     self.assertEqual(users[0].email, '*****@*****.**')
     self.assertEqual(users[1].email, '*****@*****.**')
Пример #11
0
    def test_empty_password_field(self):
        self.request.context = User.by_id(2)

        # simulate that password field was left empty
        appstruct = copy.deepcopy(self.APPSTRUCT)
        appstruct['password'] = ''

        # submit form
        self.view.save_success(appstruct)

        # assert that secret fields remained unchanged
        user = User.by_id(2)
        self.assertEqual(user.email, '*****@*****.**')
        self.assertTrue(verify('secret', user.password))
Пример #12
0
 def test_loginas_view_submit_disabled_user(self):
     from pyramid_bimt.models import User
     from pyramid_bimt.views.auth import LoginAs
     context = User.by_email('*****@*****.**')
     request = testing.DummyRequest(
         layout_manager=mock.Mock(),
         session=mock.Mock(),
     )
     form_values = {'email': '*****@*****.**'}
     request.user = context
     view = LoginAs(request)
     User.by_email('*****@*****.**').disable()
     self.assertIsNone(view.login_as_success(form_values))
     request.session.flash.assert_called_once_with(
         u'User "*****@*****.**" is disabled.', 'error')
Пример #13
0
    def test_union(self):
        add_groups()
        add_users()
        mailing = _make_mailing(
            name='foo',
            groups=[Group.by_name('admins'),
                    Group.by_name('staff')],
        )
        self.request.context = mailing

        self.assertItemsEqual(
            self.view.recipients,
            [User.by_email('*****@*****.**'),
             User.by_email('*****@*****.**')],
        )
Пример #14
0
    def test_save_success_disabled_stays_disabled(self):
        self.request.context = User.by_id(2)
        self.request.context.disable()

        result = self.view.save_success(self.APPSTRUCT)
        self.assertIsInstance(result, HTTPFound)
        self.assertEqual(result.location, '/user/2/')

        user = User.by_id(2)

        self.assertEqual(user.groups, [Group.by_id(1)])
        self.assertEqual(
            self.request.session.pop_flash(),
            [u'User "*****@*****.**" modified.'],
        )
Пример #15
0
def _make_user(id=1,
               email='*****@*****.**',
               fullname=u'Foö Bar',
               affiliate=u'Aff',
               billing_email='*****@*****.**',
               valid_to=date(2014, 2, 1),
               last_payment=date(2014, 1, 1),
               groups=None,
               properties=None,
               audit_log_entries=None):
    if not groups:  # pragma: no branch
        groups = [_make_group()]
    if not properties:  # pragma: no branch
        properties = [_make_property()]
    if not audit_log_entries:  # pragma: no branch
        audit_log_entries = [_make_audit_log_entry()]
    return User(
        id=id,
        email=email,
        fullname=fullname,
        affiliate=affiliate,
        billing_email=billing_email,
        valid_to=valid_to,
        last_payment=last_payment,
        groups=groups,
        properties=properties,
        audit_log_entries=audit_log_entries,
    )
Пример #16
0
    def save_success(self, appstruct):
        group = self.request.context

        group.name = appstruct.get('name')
        group.product_id = appstruct.get('product_id')
        group.validity = appstruct.get('validity')
        group.trial_validity = appstruct.get('trial_validity')
        group.addon = appstruct.get('addon')
        group.forward_ipn_to_url = appstruct.get('forward_ipn_to_url')

        group.users = [
            User.by_id(user_id) for user_id in appstruct.get('users', [])
        ]  # noqa
        group.upgrade_groups = [
            Group.by_id(group_id)
            for group_id in appstruct.get('upgrade_groups', [])
        ]  # noqa

        # remove properties that are not present in appstruct
        for prop in copy.copy(group.properties):
            if prop.key not in [p['key'] for p in appstruct['properties']]:
                group.properties.remove(prop)

        # update/create properties present in appstruct
        for prop in appstruct['properties']:
            if group.get_property(prop['key'], None) is not None:
                group.set_property(key=prop['key'], value=prop['value'])
            else:
                group.properties.append(
                    GroupProperty(key=prop['key'], value=prop['value']))

        self.request.session.flash(u'Group "{}" modified.'.format(group.name))
        return HTTPFound(
            location=self.request.route_path('group_edit', group_id=group.id))
Пример #17
0
    def submit_success(self, appstruct):
        group = Group(
            name=appstruct.get('name'),
            product_id=appstruct.get('product_id'),
            validity=appstruct.get('validity'),
            trial_validity=appstruct.get('trial_validity'),
            addon=appstruct.get('addon'),
            forward_ipn_to_url=appstruct.get('forward_ipn_to_url'),
            users=[
                User.by_id(user_id) for user_id in appstruct.get('users', [])
            ],  # noqa
            upgrade_groups=[
                Group.by_id(group_id)
                for group_id in appstruct.get('upgrade_groups', [])
            ],  # noqa
            properties=[
                GroupProperty(key=prop['key'], value=prop['value'])
                for prop in appstruct.get('properties', [])
            ],
        )

        Session.add(group)
        Session.flush()
        self.request.session.flash(u'Group "{}" added.'.format(group.name))
        return HTTPFound(
            location=self.request.route_path('group_edit', group_id=group.id))
Пример #18
0
 def test_get_enabled(self):
     enabled = User.get_enabled()
     self.assertEqual(len(enabled), 3)
     self.assertItemsEqual(
         [user.email for user in enabled],
         ['*****@*****.**', '*****@*****.**', '*****@*****.**'],
     )
Пример #19
0
    def login_as_success(self, appstruct):

        email = appstruct['email'].lower()
        user = User.by_email(email)
        if user is None:
            self.request.session.flash(u'User with that email does not exist.',
                                       'error')
        elif not user.enabled:
            self.request.session.flash(
                u'User "{}" is disabled.'.format(user.email), 'error')
        elif user.admin and not self.request.user.admin:
            self.request.session.flash(
                u'You do not have permission to login as admin user.', 'error')
        elif user.staff and not self.request.user.staff:
            self.request.session.flash(
                u'You do not have permission to login as staff user.', 'error')
        else:
            headers = remember(self.request, user.email)
            self.request.session.flash(
                u'You have successfully logged in as user "{}".'.format(
                    user.email))
            self.request.registry.notify(
                UserLoggedInAs(self.request,
                               self.request.user,
                               comment=u'Logged in as "{}".'.format(
                                   user.email)))
            return HTTPFound(location=self.request.host_url, headers=headers)
Пример #20
0
 def test_search_fullname(self):
     _make_user(email='*****@*****.**', fullname=u'aaaaa')
     _make_user(email='*****@*****.**', fullname=u'ccccc')
     _make_user(email='*****@*****.**', fullname=u'bbbbb')
     users = User.get_all(search='ccccc').all()
     self.assertEqual(len(users), 1)
     self.assertEqual(users[0].email, '*****@*****.**')
Пример #21
0
 def test_offset(self):
     _make_user(email='*****@*****.**')
     _make_user(email='*****@*****.**')
     _make_user(email='*****@*****.**')
     users = User.get_all(offset=(1, 2)).all()
     self.assertEqual(len(users), 1)
     self.assertEqual(users[0].email, '*****@*****.**')
Пример #22
0
 def test_search_email(self):
     _make_user(email='*****@*****.**')
     _make_user(email='*****@*****.**')
     _make_user(email='*****@*****.**')
     users = User.get_all(search='baz').all()
     self.assertEqual(len(users), 1)
     self.assertEqual(users[0].email, '*****@*****.**')
Пример #23
0
def add_users():
    """Init the '*****@*****.**' and '*****@*****.**' user accounts."""
    with transaction.manager:
        admins = Group.by_name('admins')
        staff = Group.by_name('staff')
        enabled = Group.by_name('enabled')
        trial = Group.by_name('trial')

        # Create the admin user account
        admin = User(
            email=u'*****@*****.**',
            password=SECRET_ENC,
            fullname=u'Ädmin',
            properties=[
                UserProperty(key=u'bimt', value=u'on'),
            ],
        )
        admin.groups.append(admins)
        admin.groups.append(enabled)
        Session.add(admin)

        # Create the staff member account
        staff_member = User(
            email=u'*****@*****.**',
            password=SECRET_ENC,
            fullname=u'Stäff Member',
            properties=[
                UserProperty(key=u'bimt', value=u'on'),
            ],
        )
        staff_member.groups.append(enabled)
        staff_member.groups.append(staff)
        Session.add(staff_member)

        # Create the normal user account
        one = User(
            email=u'*****@*****.**',
            billing_email=u'*****@*****.**',
            password=SECRET_ENC,
            fullname=u'Öne Bar',
            properties=[
                UserProperty(key=u'bimt', value=u'on'),
            ],
        )
        one.groups.append(enabled)
        one.groups.append(trial)
        Session.add(one)
Пример #24
0
 def test_groups_choices_non_admin(self):
     self.request.user = User.by_email('*****@*****.**')
     self.view = UserAdd(self.request)
     choices = [
         group for id_, group in self.view.schema['groups'].widget.values
     ]
     self.assertFalse('enabled' in choices)
     self.assertFalse('admins' in choices)
Пример #25
0
 def test_no_group(self):
     group = _make_group()
     _make_user(groups=[
         group,
     ])
     _make_portlet(name='foo', groups=[], position='above_content')
     portlets = Portlet.by_user_and_position(User.by_id(1), 'above_content')
     self.assertEqual(len(portlets), 0)
Пример #26
0
    def setUp(self):
        from pyramid_bimt.testing import initTestingDB
        from pyramid_bimt.models import User

        self.config = testing.setUp()
        initTestingDB(groups=True, users=True)

        self.request = testing.DummyRequest(user=User.by_email('*****@*****.**'))
Пример #27
0
 def setUp(self):
     initTestingDB(groups=True, users=True)
     self.config = testing.setUp()
     self.request = testing.DummyRequest(
         layout_manager=mock.Mock(),
         user=User.by_id(2),
     )
     self.view = SettingsForm(self.request)
Пример #28
0
 def __getitem__(self, key):
     user = User.by_id(key)
     if user:
         user.__parent__ = self
         user.__name__ = key
         return user
     else:
         raise KeyError
Пример #29
0
 def test_ordered_by_modified(self):
     _make_user(email='*****@*****.**')
     _make_user(email='*****@*****.**')
     _make_user(email='*****@*****.**')
     users = User.get_all(order_by='modified', order_direction='desc').all()
     self.assertEqual(len(users), 3)
     self.assertEqual(users[0].email, '*****@*****.**')
     self.assertEqual(users[1].email, '*****@*****.**')
     self.assertEqual(users[2].email, '*****@*****.**')
Пример #30
0
 def test_ordered_by_created(self):
     _make_user(email='*****@*****.**')
     _make_user(email='*****@*****.**')
     _make_user(email='*****@*****.**')
     users = User.get_all(order_by='created').all()
     self.assertEqual(len(users), 3)
     self.assertEqual(users[0].email, '*****@*****.**')
     self.assertEqual(users[1].email, '*****@*****.**')
     self.assertEqual(users[2].email, '*****@*****.**')