Add schema/enum for recording user events

i.e. login and logout, to get a very basic idea of local node activity
This commit is contained in:
Lance Edgar 2017-08-04 16:47:38 -05:00
parent 2b851a9c8c
commit 7983e92764
4 changed files with 88 additions and 1 deletions

View file

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
"""add user events
Revision ID: 1242c7a0e24a
Revises: cc3de1ca0689
Create Date: 2017-08-04 16:41:40.837455
"""
from __future__ import unicode_literals, absolute_import
# revision identifiers, used by Alembic.
revision = '1242c7a0e24a'
down_revision = u'cc3de1ca0689'
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
import rattail.db.types
def upgrade():
# user_event
op.create_table('user_event',
sa.Column('uuid', sa.String(length=32), nullable=False),
sa.Column('user_uuid', sa.String(length=32), nullable=False),
sa.Column('type_code', sa.Integer(), nullable=False),
sa.Column('occurred', sa.DateTime(), nullable=True),
sa.ForeignKeyConstraint(['user_uuid'], [u'user.uuid'], name=u'user_x_role_fk_user'),
sa.PrimaryKeyConstraint('uuid')
)
def downgrade():
# user_event
op.drop_table('user_event')

View file

@ -30,7 +30,7 @@ from .core import Base, ModelBase, uuid_column, getset_factory, GPCType, Setting
from .contact import PhoneNumber, EmailAddress, MailingAddress
from .people import Person, PersonPhoneNumber, PersonEmailAddress, PersonMailingAddress
from .users import Role, Permission, User, UserRole
from .users import Role, Permission, User, UserRole, UserEvent
from .stores import Store, StorePhoneNumber, StoreEmailAddress
from .customers import (Customer, CustomerPhoneNumber, CustomerEmailAddress, CustomerMailingAddress,
CustomerGroup, CustomerGroupAssignment, CustomerPerson)

View file

@ -26,6 +26,8 @@ Data Models for Users & Permissions
from __future__ import unicode_literals, absolute_import
import datetime
import six
import sqlalchemy as sa
from sqlalchemy import orm
@ -199,6 +201,10 @@ class User(Base):
session = orm.object_session(self)
return administrator_role(session) in self.roles
def record_event(self, type_code, **kwargs):
kwargs['type_code'] = type_code
self.events.append(UserEvent(**kwargs))
User.person = orm.relationship(
Person,
@ -244,3 +250,35 @@ User.roles = association_proxy(
'_roles', 'role',
creator=lambda r: UserRole(role=r),
getset_factory=getset_factory)
class UserEvent(Base):
"""
Represents an event associated with a user.
"""
__tablename__ = 'user_event'
__table_args__ = (
sa.ForeignKeyConstraint(['user_uuid'], ['user.uuid'], name='user_x_role_fk_user'),
)
uuid = uuid_column()
user_uuid = sa.Column(sa.String(length=32), nullable=False)
user = orm.relationship(
User,
doc="""
Reference to the user whose event this is.
""",
backref=orm.backref(
'events',
doc="""
Sequence of events for the user.
"""))
type_code = sa.Column(sa.Integer(), nullable=False, doc="""
Type code for the event.
""")
occurred = sa.Column(sa.DateTime(), nullable=True, default=datetime.datetime.utcnow, doc="""
Timestamp at which the event occurred.
""")

View file

@ -364,6 +364,15 @@ UNIT_OF_MEASURE = {
}
USER_EVENT_LOGIN = 1
USER_EVENT_LOGOUT = 2
USER_EVENT = {
'USER_EVENT_LOGIN' : "login",
'USER_EVENT_LOGOUT' : "logout",
}
EMPLOYEE_STATUS_CURRENT = 1
EMPLOYEE_STATUS_FORMER = 2