Exemple #1
0
    def define_signature(self):
        db = self.db
        settings = self.settings
        request = current.request
        T = current.T
        reference_user = '******' % settings.table_user_name

        def lazy_user(auth=self):
            return auth.user_id

        def represent(id, record=None, s=settings):
            try:
                user = s.table_user(id)
                return '%s %s' % (user.get("first_name", user.get("email")),
                                  user.get("last_name", ''))
            except:
                return id

        ondelete = self.settings.ondelete
        self.signature = Table(
            self.db, 'auth_signature',
            Field('is_active',
                  'boolean',
                  default=True,
                  readable=False,
                  writable=False,
                  label=T('Is Active')),
            Field('created_on',
                  'datetime',
                  default=request.now,
                  writable=False,
                  readable=False,
                  label=T('Created On')),
            Field('created_by',
                  reference_user,
                  default=lazy_user,
                  represent=represent,
                  writable=False,
                  readable=False,
                  label=T('Created By'),
                  ondelete=ondelete),
            Field('modified_on',
                  'datetime',
                  update=request.now,
                  default=request.now,
                  writable=False,
                  readable=False,
                  label=T('Modified On')),
            Field('modified_by',
                  reference_user,
                  represent=represent,
                  default=lazy_user,
                  update=lazy_user,
                  writable=False,
                  readable=False,
                  label=T('Modified By'),
                  ondelete=ondelete))
Exemple #2
0
    def __init__(self, search_queries, queries=None):
        self.search_queries = search_queries
        self.queries = queries

        field_names = []
        field_requires = dict()
        for field in self.search_queries:
            field_name = 'sq_' + field[0].replace(' ', '_').lower()
            field_names.append(field_name)
            if len(field) > 2:
                field_requires[field_name] = field[2]

        field_values = dict()
        for field in field_names:
            if field in request.query:
                field_values[field] = unquote_plus(request.query[field])

        form_fields = []
        for field in field_names:
            label = field.replace('sq_', '').replace('_', ' ').title()
            placeholder = field.replace('sq_', '').replace('_', ' ').capitalize()
            form_fields.append(Field(field,
                                     length=50,
                                     default=field_values[field] if field in field_values else None,
                                     _placeholder=placeholder,
                                     label=label,
                                     requires=field_requires[field] if field in field_requires else None,
                                     _title=placeholder))

        self.search_form = Form(form_fields,
                                keep_values=True,
                                formstyle=FormStyleBulma,
                                form_name='search_form')

        if self.search_form.accepted:
            for field in field_names:
                field_values[field] = self.search_form.vars[field]

        if not self.queries:
            self.queries = []
        for sq in self.search_queries:
            field_name = 'sq_' + sq[0].replace(' ', '_').lower()
            if field_name in field_values and field_values[field_name]:
                self.queries.append(sq[1](field_values[field_name]))

        self.query = reduce(lambda a, b: (a & b), self.queries)
Exemple #3
0
    def define_tables(self,
                      username=None,
                      signature=None,
                      migrate=None,
                      fake_migrate=None):
        """
        To be called unless tables are defined manually

        Examples:
            Use as::

                # defines all needed tables and table files
                # 'myprefix_auth_user.table', ...
                auth.define_tables(migrate='myprefix_')

                # defines all needed tables without migration/table files
                auth.define_tables(migrate=False)

        """

        db = self.db
        if migrate is None:
            migrate = db._migrate
        if fake_migrate is None:
            fake_migrate = db._fake_migrate

        settings = self.settings
        if username is None:
            username = settings.use_username
        else:
            settings.use_username = username

        if not self.signature:
            self.define_signature()
        if signature is True:
            signature_list = [self.signature]
        elif not signature:
            signature_list = []
        elif isinstance(signature, Table):
            signature_list = [signature]
        else:
            signature_list = signature
        self._table_signature_list = signature_list  # Should it defined in __init__ first??

        is_not_empty = IS_NOT_EMPTY(error_message=self.messages.is_empty)
        is_crypted = CRYPT(key=settings.hmac_key,
                           min_length=settings.password_min_length)
        is_unique_email = [
            IS_EMAIL(error_message=self.messages.invalid_email),
            IS_NOT_IN_DB(db,
                         '%s.email' % settings.table_user_name,
                         error_message=self.messages.email_taken)
        ]
        if not settings.email_case_sensitive:
            is_unique_email.insert(1, IS_LOWER())
        if settings.table_user_name not in db.tables:
            passfield = settings.password_field
            extra_fields = settings.extra_fields.get(settings.table_user_name,
                                                     []) + signature_list
            # cas_provider Will always be None here but we compare it anyway so subclasses can use our define_tables
            if username or settings.cas_provider:
                is_unique_username = \
                    [IS_MATCH('[\w\.\-]+', strict=True,
                              error_message=self.messages.invalid_username),
                     IS_NOT_IN_DB(db, '%s.username' % settings.table_user_name,
                                  error_message=self.messages.username_taken)]
                if not settings.username_case_sensitive:
                    is_unique_username.insert(1, IS_LOWER())
                db.define_table(
                    settings.table_user_name,
                    Field('first_name',
                          length=128,
                          default='',
                          label=self.messages.label_first_name,
                          requires=is_not_empty),
                    Field('last_name',
                          length=128,
                          default='',
                          label=self.messages.label_last_name,
                          requires=is_not_empty),
                    Field('email',
                          length=512,
                          default='',
                          label=self.messages.label_email,
                          requires=is_unique_email),
                    Field('username',
                          length=128,
                          default='',
                          label=self.messages.label_username,
                          requires=is_unique_username),
                    Field(passfield,
                          'password',
                          length=512,
                          readable=False,
                          label=self.messages.label_password,
                          requires=[is_crypted]),
                    Field('registration_key',
                          length=512,
                          writable=False,
                          readable=False,
                          default='',
                          label=self.messages.label_registration_key),
                    Field('reset_password_key',
                          length=512,
                          writable=False,
                          readable=False,
                          default='',
                          label=self.messages.label_reset_password_key),
                    Field('registration_id',
                          length=512,
                          writable=False,
                          readable=False,
                          default='',
                          label=self.messages.label_registration_id),
                    *extra_fields,
                    **dict(migrate=self._get_migrate(settings.table_user_name,
                                                     migrate),
                           fake_migrate=fake_migrate,
                           format='%(username)s'))
            else:
                db.define_table(
                    settings.table_user_name,
                    Field('first_name',
                          length=128,
                          default='',
                          label=self.messages.label_first_name,
                          requires=is_not_empty),
                    Field('last_name',
                          length=128,
                          default='',
                          label=self.messages.label_last_name,
                          requires=is_not_empty),
                    Field('email',
                          length=512,
                          default='',
                          label=self.messages.label_email,
                          requires=is_unique_email),
                    Field(passfield,
                          'password',
                          length=512,
                          readable=False,
                          label=self.messages.label_password,
                          requires=[is_crypted]),
                    Field('registration_key',
                          length=512,
                          writable=False,
                          readable=False,
                          default='',
                          label=self.messages.label_registration_key),
                    Field('reset_password_key',
                          length=512,
                          writable=False,
                          readable=False,
                          default='',
                          label=self.messages.label_reset_password_key),
                    Field('registration_id',
                          length=512,
                          writable=False,
                          readable=False,
                          default='',
                          label=self.messages.label_registration_id),
                    *extra_fields,
                    **dict(migrate=self._get_migrate(settings.table_user_name,
                                                     migrate),
                           fake_migrate=fake_migrate,
                           format='%(first_name)s %(last_name)s (%(id)s)'))
        reference_table_user = '******' % settings.table_user_name
        if settings.table_group_name not in db.tables:
            extra_fields = settings.extra_fields.get(settings.table_group_name,
                                                     []) + signature_list
            db.define_table(
                settings.table_group_name,
                Field('role',
                      length=512,
                      default='',
                      label=self.messages.label_role,
                      requires=IS_NOT_IN_DB(
                          db, '%s.role' % settings.table_group_name)),
                Field('description',
                      'text',
                      label=self.messages.label_description), *extra_fields,
                **dict(migrate=self._get_migrate(settings.table_group_name,
                                                 migrate),
                       fake_migrate=fake_migrate,
                       format='%(role)s (%(id)s)'))
        reference_table_group = 'reference %s' % settings.table_group_name
        if settings.table_membership_name not in db.tables:
            extra_fields = settings.extra_fields.get(
                settings.table_membership_name, []) + signature_list
            db.define_table(
                settings.table_membership_name,
                Field('user_id',
                      reference_table_user,
                      label=self.messages.label_user_id),
                Field('group_id',
                      reference_table_group,
                      label=self.messages.label_group_id), *extra_fields,
                **dict(migrate=self._get_migrate(
                    settings.table_membership_name, migrate),
                       fake_migrate=fake_migrate))
        if settings.table_permission_name not in db.tables:
            extra_fields = settings.extra_fields.get(
                settings.table_permission_name, []) + signature_list
            db.define_table(
                settings.table_permission_name,
                Field('group_id',
                      reference_table_group,
                      label=self.messages.label_group_id),
                Field('name',
                      default='default',
                      length=512,
                      label=self.messages.label_name,
                      requires=is_not_empty),
                Field('table_name',
                      length=512,
                      label=self.messages.label_table_name),
                Field('record_id',
                      'integer',
                      default=0,
                      label=self.messages.label_record_id,
                      requires=IS_INT_IN_RANGE(0, 10**9)), *extra_fields,
                **dict(migrate=self._get_migrate(
                    settings.table_permission_name, migrate),
                       fake_migrate=fake_migrate))
        if settings.table_event_name not in db.tables:
            db.define_table(
                settings.table_event_name,
                Field('time_stamp',
                      'datetime',
                      default=current.request.now,
                      label=self.messages.label_time_stamp),
                Field('client_ip',
                      default=current.request.client,
                      label=self.messages.label_client_ip),
                Field('user_id',
                      reference_table_user,
                      default=None,
                      label=self.messages.label_user_id),
                Field('origin',
                      default='auth',
                      length=512,
                      label=self.messages.label_origin,
                      requires=is_not_empty),
                Field('description',
                      'text',
                      default='',
                      label=self.messages.label_description,
                      requires=is_not_empty),
                *settings.extra_fields.get(settings.table_event_name, []),
                **dict(migrate=self._get_migrate(settings.table_event_name,
                                                 migrate),
                       fake_migrate=fake_migrate))

        return self