Compare commits

..

No commits in common. "a0b35dfadba1fe61c48edc0b1bcaa460a470ce07" and "3bfda431fa75966537f709c7572092ae27e00b79" have entirely different histories.

15 changed files with 56 additions and 124 deletions

View file

@ -1,29 +1,4 @@
0.1.2
-----
* Allow config file to prevent logging configuration from happening.
0.1.1
-----
* Some random things required in production at MaMa Jean's...
Specifically this is known to replace occurrences of e.g. ``edbob.User`` with
a more standard (properly imported) reference to ``User``.
0.1a29
------
* Removed ``setup.cfg`` file.
* Changed some logging instances from ``INFO`` to ``DEBUG``.
* Updated ``repr()`` output for model classes.
0.1a28
------

View file

@ -1 +1 @@
__version__ = '0.1.2'
__version__ = '0.1a28'

View file

@ -51,8 +51,7 @@ class Permission(Base):
permission = Column(String(50), primary_key=True)
def __repr__(self):
return "Permission(role_uuid={0}, permission={1})".format(
repr(self.role_uuid), repr(self.permission))
return "<Permission: %s, %s>" % (self.role, self.permission)
def __unicode__(self):
return unicode(self.permission or '')
@ -70,7 +69,7 @@ class UserRole(Base):
role_uuid = Column(String(32), ForeignKey('roles.uuid'))
def __repr__(self):
return "UserRole(uuid={0})".format(repr(self.uuid))
return "<UserRole: %s : %s>" % (self.user, self.role)
class Role(Base):
@ -98,7 +97,7 @@ class Role(Base):
getset_factory=getset_factory)
def __repr__(self):
return "Role(uuid={0})".format(repr(self.uuid))
return "<Role: %s>" % self.name
def __unicode__(self):
return unicode(self.name or '')
@ -125,7 +124,7 @@ class User(Base):
getset_factory=getset_factory)
def __repr__(self):
return "User(uuid={0})".format(repr(self.uuid))
return "<User: %s>" % self.username
def __unicode__(self):
return unicode(self.username or '')

View file

@ -72,8 +72,7 @@ class PhoneNumber(Base):
__mapper_args__ = {'polymorphic_on': parent_type}
def __repr__(self):
return "{0}(uuid={1})".format(
self.__class__.__name__, repr(self.uuid))
return "<%s: %s>" % (self.__class__.__name__, self.number)
def __unicode__(self):
return unicode(self.number)
@ -104,8 +103,7 @@ class EmailAddress(Base):
__mapper_args__ = {'polymorphic_on': parent_type}
def __repr__(self):
return "{0}(uuid={1})".format(
self.__class__.__name__, repr(self.uuid))
return "<%s: %s>" % (self.__class__.__name__, self.address)
def __unicode__(self):
return unicode(self.address)
@ -133,7 +131,7 @@ class Person(Base):
display_name = Column(String(100), default=get_person_display_name)
def __repr__(self):
return "Person(uuid={0})".format(repr(self.uuid))
return "<Person: %s>" % self.display_name
def __unicode__(self):
return unicode(self.display_name or '')

View file

@ -54,7 +54,7 @@ class ActiveExtension(Base):
name = Column(String(50), primary_key=True)
def __repr__(self):
return "ActiveExtension(name={0})".format(repr(self.name))
return "<ActiveExtension: %s>" % self.name
def __str__(self):
return str(self.name or '')
@ -71,4 +71,4 @@ class Setting(Base):
value = Column(Text)
def __repr__(self):
return "Setting(name={0})".format(repr(self.name))
return "<Setting: %s>" % self.name

View file

@ -28,19 +28,11 @@
import sys
import os.path
import pyinotify
import threading
import Queue
import logging
try:
import pyinotify
except ImportError:
# Mock out for testing on Windows.
class Dummy(object):
pass
pyinotify = Dummy()
pyinotify.ProcessEvent = Dummy
import edbob
from edbob import filemon
from edbob.daemon import Daemon

View file

@ -89,8 +89,7 @@ def init(appname='edbob', *args, **kwargs):
shell = kwargs.get('shell', False)
for paths in config_paths:
config.read(paths, recurse=not shell)
if config.getboolean('edbob', 'configure_logging', default=True):
config.configure_logging()
config.configure_logging()
default_modules = 'edbob.time'
modules = config.get('edbob', 'init', default=default_modules)

View file

@ -33,38 +33,37 @@ from sqlalchemy import and_
# from formalchemy import Field
import edbob
# from edbob.pyramid import filters
# from edbob.pyramid import forms
# from edbob.pyramid import grids
# from edbob.pyramid import Session
from edbob.pyramid.views import SearchableAlchemyGridView, CrudView
from edbob.db.extensions.contact.model import (
Person, PersonEmailAddress, PersonPhoneNumber)
class PeopleGrid(SearchableAlchemyGridView):
mapped_class = Person
mapped_class = edbob.Person
config_prefix = 'people'
sort = 'first_name'
def join_map(self):
return {
'email':
lambda q: q.outerjoin(PersonEmailAddress, and_(
PersonEmailAddress.parent_uuid == Person.uuid,
PersonEmailAddress.preference == 1)),
lambda q: q.outerjoin(edbob.PersonEmailAddress, and_(
edbob.PersonEmailAddress.parent_uuid == edbob.Person.uuid,
edbob.PersonEmailAddress.preference == 1)),
'phone':
lambda q: q.outerjoin(PersonPhoneNumber, and_(
PersonPhoneNumber.parent_uuid == Person.uuid,
PersonPhoneNumber.preference == 1)),
lambda q: q.outerjoin(edbob.PersonPhoneNumber, and_(
edbob.PersonPhoneNumber.parent_uuid == edbob.Person.uuid,
edbob.PersonPhoneNumber.preference == 1)),
}
def filter_map(self):
return self.make_filter_map(
ilike=['first_name', 'last_name'],
email=self.filter_ilike(PersonEmailAddress.address),
phone=self.filter_ilike(PersonPhoneNumber.number))
email=self.filter_ilike(edbob.PersonEmailAddress.address),
phone=self.filter_ilike(edbob.PersonPhoneNumber.number))
def filter_config(self):
return self.make_filter_config(
@ -78,8 +77,8 @@ class PeopleGrid(SearchableAlchemyGridView):
def sort_map(self):
return self.make_sort_map(
'first_name', 'last_name',
email=self.sorter(PersonEmailAddress.address),
phone=self.sorter(PersonPhoneNumber.number))
email=self.sorter(edbob.PersonEmailAddress.address),
phone=self.sorter(edbob.PersonPhoneNumber.number))
def grid(self):
g = self.make_grid()
@ -98,7 +97,7 @@ class PeopleGrid(SearchableAlchemyGridView):
class PersonCrud(CrudView):
mapped_class = Person
mapped_class = edbob.Person
home_route = 'people'
def fieldset(self, model):

View file

@ -32,10 +32,10 @@ import formalchemy
from webhelpers.html import tags
from webhelpers.html.builder import HTML
import edbob
from edbob.db import auth
from edbob.pyramid import Session
from edbob.pyramid.views import SearchableAlchemyGridView, CrudView
from edbob.db.extensions.auth.model import Role
default_permissions = [
@ -68,7 +68,7 @@ default_permissions = [
class RolesGrid(SearchableAlchemyGridView):
mapped_class = Role
mapped_class = edbob.Role
config_prefix = 'roles'
sort = 'name'
@ -161,7 +161,7 @@ def PermissionsFieldRenderer(permissions, *args, **kwargs):
class RoleCrud(CrudView):
mapped_class = Role
mapped_class = edbob.Role
home_route = 'roles'
permissions = default_permissions

View file

@ -32,29 +32,28 @@ from webhelpers.html.builder import HTML
import formalchemy
from formalchemy.fields import SelectFieldRenderer
import edbob
from edbob.db import auth
from edbob.pyramid import Session
from edbob.pyramid.views import SearchableAlchemyGridView, CrudView
from edbob.db.extensions.auth.model import User, Role
from edbob.db.extensions.contact.model import Person
class UsersGrid(SearchableAlchemyGridView):
mapped_class = User
mapped_class = edbob.User
config_prefix = 'users'
sort = 'username'
def join_map(self):
return {
'person':
lambda q: q.outerjoin(Person),
lambda q: q.outerjoin(edbob.Person),
}
def filter_map(self):
return self.make_filter_map(
ilike=['username'],
person=self.filter_ilike(Person.display_name))
person=self.filter_ilike(edbob.Person.display_name))
def filter_config(self):
return self.make_filter_config(
@ -66,7 +65,7 @@ class UsersGrid(SearchableAlchemyGridView):
def sort_map(self):
return self.make_sort_map(
'username',
person=self.sorter(Person.display_name))
person=self.sorter(edbob.Person.display_name))
def grid(self):
g = self.make_grid()
@ -93,7 +92,7 @@ def RolesFieldRenderer(request):
class RolesFieldRenderer(SelectFieldRenderer):
def render_readonly(self, **kwargs):
roles = Session.query(Role)
roles = Session.query(edbob.Role)
html = ''
for uuid in self.value:
role = roles.get(uuid)
@ -118,15 +117,15 @@ class RolesField(formalchemy.Field):
return [x.uuid for x in user.roles]
def get_options(self):
q = Session.query(Role.name, Role.uuid)
q = q.filter(Role.uuid != auth.guest_role(Session()).uuid)
q = q.order_by(Role.name)
q = Session.query(edbob.Role.name, edbob.Role.uuid)
q = q.filter(edbob.Role.uuid != auth.guest_role(Session()).uuid)
q = q.order_by(edbob.Role.name)
return q.all()
def sync(self):
if not self.is_readonly():
user = self.model
roles = Session.query(Role)
roles = Session.query(edbob.Role)
data = self.renderer.deserialize()
user.roles = [roles.get(x) for x in data]
@ -141,7 +140,7 @@ class _ProtectedPersonRenderer(formalchemy.FieldRenderer):
def ProtectedPersonRenderer(uuid):
person = Session.query(Person).get(uuid)
person = Session.query(edbob.Person).get(uuid)
assert person
return type('ProtectedPersonRenderer', (_ProtectedPersonRenderer,),
{'person': person})
@ -188,7 +187,7 @@ class PasswordField(formalchemy.Field):
class UserCrud(CrudView):
mapped_class = User
mapped_class = edbob.User
home_route = 'users'
def fieldset(self, user):
@ -214,7 +213,7 @@ class UserCrud(CrudView):
del fs.confirm_password
# if fs.edit and user.person:
if isinstance(user, User) and user.person:
if isinstance(user, edbob.User) and user.person:
fs.person.set(readonly=True,
renderer=LinkedPersonRenderer(self.request))

View file

@ -1,19 +0,0 @@
import unittest
from pyramid import testing
class TestCase(unittest.TestCase):
"""
Base class for all test suites.
"""
def setUp(self):
self.config = testing.setUp()
def tearDown(self):
testing.tearDown()
def test_something(self):
self.assertTrue(1)

View file

@ -38,17 +38,9 @@ if sys.platform == 'win32': # docs should build for everyone
import win32file
import win32print
import win32service
import win32serviceutil
import winerror
try:
import win32serviceutil
except ImportError:
# Mock out for testing on Linux.
class Object(object):
pass
win32serviceutil = Object()
win32serviceutil.ServiceFramework = Object
import edbob

16
fabfile.py vendored
View file

@ -22,15 +22,25 @@
#
################################################################################
import shutil
import os.path
from fabric.api import *
execfile(os.path.join(os.path.dirname(__file__), 'edbob', '_version.py'))
@task
def release():
"""
Release a new version of 'edbob'.
"""
shutil.rmtree('edbob.egg-info')
local('python setup.py sdist --formats=gztar register upload')
local("python setup.py egg_info --tag-build='' sdist --formats=gztar")
filename = 'edbob-{0}.tar.gz'.format(__version__)
put(os.path.join('dist', filename), '/srv/pypi/{0}'.format(filename))
with cd('/srv/pypi'):
run('rm --recursive --force simple')
run('compoze index')

View file

@ -1,7 +0,0 @@
[nosetests]
nocapture = 1
cover-package = edbob
cover-erase = 1
cover-inclusive = 1
cover-html = 1
cover-html-dir = htmlcov

View file

@ -73,10 +73,7 @@ requires = [
'decorator', # 3.3.2
'lockfile', # 0.9.1
'progressbar', # 2.3
# Hardcode ``pytz`` minimum since apparently it isn't (any longer?) enough
# to simply require the library.
'pytz>=2013b', # 2013b
'pytz', # 2012b
]
if sys.version_info < (2, 7):
@ -212,8 +209,6 @@ setup(
install_requires = requires,
extras_require = extras,
tests_require = requires + ['nose'],
test_suite = 'nose.collector',
packages = find_packages(),
include_package_data = True,