add 'contact' extension, move Person to it
This commit is contained in:
parent
75d680a8b0
commit
230a0d7775
6 changed files with 171 additions and 35 deletions
|
@ -178,7 +178,8 @@ class Extension(edbob.Object):
|
||||||
for name in model.__all__:
|
for name in model.__all__:
|
||||||
obj = getattr(model, name)
|
obj = getattr(model, name)
|
||||||
if isinstance(obj, type) and issubclass(obj, model.Base):
|
if isinstance(obj, type) and issubclass(obj, model.Base):
|
||||||
obj.__table__.tometadata(metadata)
|
if obj.__tablename__ not in metadata.tables:
|
||||||
|
obj.__table__.tometadata(metadata)
|
||||||
|
|
||||||
# def remove_class(self, name):
|
# def remove_class(self, name):
|
||||||
# """
|
# """
|
||||||
|
|
|
@ -35,3 +35,4 @@ from edbob.db.extensions.auth.model import __all__
|
||||||
class AuthExtension(Extension):
|
class AuthExtension(Extension):
|
||||||
|
|
||||||
name = 'auth'
|
name = 'auth'
|
||||||
|
required_extensions = ['contact']
|
||||||
|
|
|
@ -32,38 +32,11 @@ from sqlalchemy.ext.associationproxy import association_proxy
|
||||||
|
|
||||||
import edbob
|
import edbob
|
||||||
from edbob.db.model import Base, uuid_column
|
from edbob.db.model import Base, uuid_column
|
||||||
|
from edbob.db.extensions.contact import Person
|
||||||
from edbob.sqlalchemy import getset_factory
|
from edbob.sqlalchemy import getset_factory
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['Person', 'Role', 'User', 'UserRole', 'Permission']
|
__all__ = ['Role', 'User', 'UserRole', 'Permission']
|
||||||
|
|
||||||
|
|
||||||
def get_person_display_name(context):
|
|
||||||
first_name = context.current_parameters['first_name']
|
|
||||||
last_name = context.current_parameters['last_name']
|
|
||||||
if not (first_name or last_name):
|
|
||||||
return None
|
|
||||||
return '%(first_name)s %(last_name)s' % locals()
|
|
||||||
|
|
||||||
|
|
||||||
class Person(Base):
|
|
||||||
"""
|
|
||||||
Represents a real, living and breathing person. (Or, at least was
|
|
||||||
previously living and breathing, in the case of the deceased.)
|
|
||||||
"""
|
|
||||||
|
|
||||||
__tablename__ = 'people'
|
|
||||||
|
|
||||||
uuid = uuid_column()
|
|
||||||
first_name = Column(String(50))
|
|
||||||
last_name = Column(String(50))
|
|
||||||
display_name = Column(String(100), default=get_person_display_name)
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<Person: %s>" % self.display_name
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return str(self.display_name or '')
|
|
||||||
|
|
||||||
|
|
||||||
class Permission(Base):
|
class Permission(Base):
|
||||||
|
@ -165,12 +138,12 @@ class User(Base):
|
||||||
return self.username
|
return self.username
|
||||||
|
|
||||||
|
|
||||||
Person.user = relationship(
|
|
||||||
User,
|
|
||||||
back_populates='person',
|
|
||||||
uselist=False)
|
|
||||||
|
|
||||||
User.person = relationship(
|
User.person = relationship(
|
||||||
Person,
|
Person,
|
||||||
back_populates='user',
|
back_populates='user',
|
||||||
uselist=False)
|
uselist=False)
|
||||||
|
|
||||||
|
Person.user = relationship(
|
||||||
|
User,
|
||||||
|
back_populates='person',
|
||||||
|
uselist=False)
|
||||||
|
|
37
edbob/db/extensions/contact/__init__.py
Normal file
37
edbob/db/extensions/contact/__init__.py
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# edbob -- Pythonic Software Framework
|
||||||
|
# Copyright © 2010-2012 Lance Edgar
|
||||||
|
#
|
||||||
|
# This file is part of edbob.
|
||||||
|
#
|
||||||
|
# edbob is free software: you can redistribute it and/or modify it under the
|
||||||
|
# terms of the GNU Affero General Public License as published by the Free
|
||||||
|
# Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# edbob is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
|
||||||
|
# more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with edbob. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
"""
|
||||||
|
``edbob.db.extensions.contact`` -- 'contact' Extension
|
||||||
|
"""
|
||||||
|
|
||||||
|
from edbob.db.extensions import Extension
|
||||||
|
|
||||||
|
from edbob.db.extensions.contact.model import *
|
||||||
|
from edbob.db.extensions.contact.model import __all__
|
||||||
|
|
||||||
|
|
||||||
|
class ContactExtension(Extension):
|
||||||
|
|
||||||
|
name = 'contact'
|
123
edbob/db/extensions/contact/model.py
Normal file
123
edbob/db/extensions/contact/model.py
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# edbob -- Pythonic Software Framework
|
||||||
|
# Copyright © 2010-2012 Lance Edgar
|
||||||
|
#
|
||||||
|
# This file is part of edbob.
|
||||||
|
#
|
||||||
|
# edbob is free software: you can redistribute it and/or modify it under the
|
||||||
|
# terms of the GNU Affero General Public License as published by the Free
|
||||||
|
# Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# edbob is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
|
||||||
|
# more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with edbob. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
"""
|
||||||
|
``edbob.db.extensions.contact.model`` -- Schema Definition
|
||||||
|
"""
|
||||||
|
|
||||||
|
from sqlalchemy import Column, String, Integer
|
||||||
|
from sqlalchemy import and_
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
from sqlalchemy.ext.orderinglist import ordering_list
|
||||||
|
|
||||||
|
from edbob.db.model import Base, uuid_column
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ['Phone', 'Person', 'PersonPhone']
|
||||||
|
|
||||||
|
|
||||||
|
def get_person_display_name(context):
|
||||||
|
"""
|
||||||
|
Provides a default value for :attr:`Person.display_name`, constructed from
|
||||||
|
:attr:`Person.first_name` and :attr:`Person.last_name`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
first_name = context.current_parameters['first_name']
|
||||||
|
last_name = context.current_parameters['last_name']
|
||||||
|
if first_name and last_name:
|
||||||
|
return first_name + ' ' + last_name
|
||||||
|
if first_name:
|
||||||
|
return first_name
|
||||||
|
if last_name:
|
||||||
|
return last_name
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class Phone(Base):
|
||||||
|
"""
|
||||||
|
Represents a phone (or fax) number associated with a contactable entity.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__tablename__ = 'phones'
|
||||||
|
|
||||||
|
uuid = uuid_column()
|
||||||
|
parent_type = Column(String(20), nullable=False)
|
||||||
|
parent_uuid = Column(String(32), nullable=False)
|
||||||
|
preference = Column(Integer, nullable=False)
|
||||||
|
type = Column(String(15))
|
||||||
|
number = Column(String(20), nullable=False)
|
||||||
|
|
||||||
|
__mapper_args__ = {'polymorphic_on': parent_type}
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<%s: %s>" % (self.__class__.__name__, self.number)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return unicode(self.number)
|
||||||
|
|
||||||
|
|
||||||
|
class PersonPhone(Phone):
|
||||||
|
"""
|
||||||
|
Represents a phone (or fax) number associated with a :class:`Person`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__mapper_args__ = {'polymorphic_identity': 'Person'}
|
||||||
|
|
||||||
|
|
||||||
|
class Person(Base):
|
||||||
|
"""
|
||||||
|
Represents a real, living and breathing person. (Or, at least was
|
||||||
|
previously living and breathing, in the case of the deceased.)
|
||||||
|
"""
|
||||||
|
|
||||||
|
__tablename__ = 'people'
|
||||||
|
|
||||||
|
uuid = uuid_column()
|
||||||
|
first_name = Column(String(50))
|
||||||
|
last_name = Column(String(50))
|
||||||
|
display_name = Column(String(100), default=get_person_display_name)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<Person: %s>" % self.display_name
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return unicode(self.display_name or '')
|
||||||
|
|
||||||
|
Person.phones = relationship(
|
||||||
|
PersonPhone,
|
||||||
|
backref='person',
|
||||||
|
primaryjoin=PersonPhone.parent_uuid == Person.uuid,
|
||||||
|
foreign_keys=[PersonPhone.parent_uuid],
|
||||||
|
collection_class=ordering_list('preference', count_from=1),
|
||||||
|
order_by=PersonPhone.preference)
|
||||||
|
|
||||||
|
Person.phone = relationship(
|
||||||
|
PersonPhone,
|
||||||
|
primaryjoin=and_(
|
||||||
|
PersonPhone.parent_uuid == Person.uuid,
|
||||||
|
PersonPhone.preference == 1,
|
||||||
|
),
|
||||||
|
foreign_keys=[PersonPhone.parent_uuid],
|
||||||
|
uselist=False,
|
||||||
|
viewonly=True)
|
1
setup.py
1
setup.py
|
@ -217,6 +217,7 @@ uuid = edbob.commands:UuidCommand
|
||||||
|
|
||||||
[edbob.db.extensions]
|
[edbob.db.extensions]
|
||||||
auth = edbob.db.extensions.auth:AuthExtension
|
auth = edbob.db.extensions.auth:AuthExtension
|
||||||
|
contact = edbob.db.extensions.contact:ContactExtension
|
||||||
|
|
||||||
""",
|
""",
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue