diff --git a/.gitignore b/.gitignore index c6552b2dd..e581cd451 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .DS_Store .idea/ .virtual_env/ +virtual_env/ +.tox/ diff --git a/lingvodoc.egg-info/PKG-INFO b/lingvodoc.egg-info/PKG-INFO new file mode 100644 index 000000000..18a7ec9a4 --- /dev/null +++ b/lingvodoc.egg-info/PKG-INFO @@ -0,0 +1,69 @@ +Metadata-Version: 1.1 +Name: lingvodoc +Version: 0.0 +Summary: lingvodoc +Home-page: https://lingvodoc.ispras.ru/ +Author: Oleg Borisenko +Author-email: al@somestuff.ru +License: UNKNOWN +Description: LingvoDoc project + ================== + + This project is dedicated to natural languages and dialects documentation. It's the continuation of Dialeqt project + (which was written in C++/QT5/Pure SQL). + LingvoDoc is intended to provide natural language documentation service as Web-service and provides REST API and + ajax-based client application. + + + Dependancies + --------------- + + - pyramid (framework) + + - sqlalchemy (ORM) + + + Running the project for development + --------------- + + - Create virtual python environment for Python (3.3+ recommended; 2.7+ should work too but is not tested) + + - Declare env variable for your virtual environment: export VENV= + + - cd + + - $VENV/bin/python setup.py develop + + - $VENV/bin/initialize_lingvodoc_db development.ini + + - $VENV/bin/pserve development.ini + + API documentation + --------------- + + /client_id + /version + /channel + /sync + /words + /word + /paradigms + /paradigm + /dictionaries + /dictionary (contains words, paradigms, corpus set etc) + /authors + /sound + /markup + + + 0.0 + --- + + - Initial version + +Keywords: web wsgi bfg pylons pyramid sqlalchemy +Platform: UNKNOWN +Classifier: Programming Language :: Python +Classifier: Framework :: Pyramid +Classifier: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application diff --git a/lingvodoc.egg-info/SOURCES.txt b/lingvodoc.egg-info/SOURCES.txt new file mode 100644 index 000000000..1c15ba30f --- /dev/null +++ b/lingvodoc.egg-info/SOURCES.txt @@ -0,0 +1,105 @@ +CHANGES.md +MANIFEST.in +README.md +alembic.ini +development.ini +log.txt +production.ini +requirements.txt +setup.py +tox.ini +lingvodoc/__init__.py +lingvodoc/acl.py +lingvodoc/models.py +lingvodoc/views.py +lingvodoc.egg-info/PKG-INFO +lingvodoc.egg-info/SOURCES.txt +lingvodoc.egg-info/dependency_links.txt +lingvodoc.egg-info/entry_points.txt +lingvodoc.egg-info/not-zip-safe +lingvodoc.egg-info/pbr.json +lingvodoc.egg-info/requires.txt +lingvodoc.egg-info/top_level.txt +lingvodoc/scripts/__init__.py +lingvodoc/scripts/corpora_converter.py +lingvodoc/scripts/initializedb.py +lingvodoc/scripts/lingvodoc_converter.py +lingvodoc/static/pyramid-16x16.png +lingvodoc/static/pyramid.png +lingvodoc/static/theme.css +lingvodoc/static/theme.min.css +lingvodoc/static/css/360-button-pause-light.gif +lingvodoc/static/css/360-button-pause-light.png +lingvodoc/static/css/360-button-pause.gif +lingvodoc/static/css/360-button-pause.png +lingvodoc/static/css/360-button-play-light.gif +lingvodoc/static/css/360-button-play-light.png +lingvodoc/static/css/360-button-play.gif +lingvodoc/static/css/360-button-play.png +lingvodoc/static/css/360-button-vis-pause-light.gif +lingvodoc/static/css/360-button-vis-pause-light.png +lingvodoc/static/css/360-button-vis-pause.gif +lingvodoc/static/css/360-button-vis-pause.png +lingvodoc/static/css/360-button-vis-play-light.gif +lingvodoc/static/css/360-button-vis-play-light.png +lingvodoc/static/css/360-button-vis-play.gif +lingvodoc/static/css/360-button-vis-play.png +lingvodoc/static/css/360player-visualization.css +lingvodoc/static/css/360player.css +lingvodoc/static/css/bootstrap-theme.css +lingvodoc/static/css/bootstrap-theme.min.css +lingvodoc/static/css/bootstrap.css +lingvodoc/static/css/bootstrap.min.css +lingvodoc/static/css/bootswatch.min.css +lingvodoc/static/css/flashblock.css +lingvodoc/static/css/icon_loading_dots.gif +lingvodoc/static/css/icon_loading_spinner.gif +lingvodoc/static/css/icon_loading_spinner_bigger.gif +lingvodoc/static/css/lingvodoc.css +lingvodoc/static/img/tweed.png +lingvodoc/static/js/360player.js +lingvodoc/static/js/angular.min.js +lingvodoc/static/js/berniecode-animator.js +lingvodoc/static/js/bootstrap.min.js +lingvodoc/static/js/jquery-1.11.1.js +lingvodoc/static/js/jquery-1.11.1.min.js +lingvodoc/static/js/jquery-2.1.1.min.js +lingvodoc/static/js/jquery.form.min.js +lingvodoc/static/js/lingvodemo.js +lingvodoc/static/js/lingvodocedit.js +lingvodoc/static/js/lingvodocview.js +lingvodoc/static/js/lingvowave.js +lingvodoc/static/js/soundmanager2-nodebug-jsmin.js +lingvodoc/static/js/soundmanager2.js +lingvodoc/static/js/ui-bootstrap-tpls-0.13.0.min.js +lingvodoc/static/js/wavesurfer.js +lingvodoc/static/js/noty/jquery.noty.js +lingvodoc/static/js/noty/promise.js +lingvodoc/static/js/noty/layouts/bottom.js +lingvodoc/static/js/noty/layouts/bottomCenter.js +lingvodoc/static/js/noty/layouts/bottomLeft.js +lingvodoc/static/js/noty/layouts/bottomRight.js +lingvodoc/static/js/noty/layouts/center.js +lingvodoc/static/js/noty/layouts/centerLeft.js +lingvodoc/static/js/noty/layouts/centerRight.js +lingvodoc/static/js/noty/layouts/inline.js +lingvodoc/static/js/noty/layouts/top.js +lingvodoc/static/js/noty/layouts/topCenter.js +lingvodoc/static/js/noty/layouts/topLeft.js +lingvodoc/static/js/noty/layouts/topRight.js +lingvodoc/static/js/noty/packaged/jquery.noty.packaged.js +lingvodoc/static/js/noty/packaged/jquery.noty.packaged.min.js +lingvodoc/static/js/noty/themes/bootstrap.js +lingvodoc/static/js/noty/themes/default.js +lingvodoc/templates/create_dictionary_page.pt +lingvodoc/templates/create_language.pt +lingvodoc/templates/dashboard.pt +lingvodoc/templates/edit_dictionary.pt +lingvodoc/templates/head.pt +lingvodoc/templates/home.pt +lingvodoc/templates/login.pt +lingvodoc/templates/nav.pt +lingvodoc/templates/register.pt +lingvodoc/templates/upload.pt +lingvodoc/templates/view_dictionary.pt +lingvodoc/templates/view_page.pt \ No newline at end of file diff --git a/lingvodoc.egg-info/dependency_links.txt b/lingvodoc.egg-info/dependency_links.txt new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lingvodoc.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/lingvodoc.egg-info/entry_points.txt b/lingvodoc.egg-info/entry_points.txt new file mode 100644 index 000000000..316c79047 --- /dev/null +++ b/lingvodoc.egg-info/entry_points.txt @@ -0,0 +1,5 @@ + [paste.app_factory] + main = lingvodoc:main + [console_scripts] + initialize_lingvodoc_db = lingvodoc.scripts.initializedb:main + \ No newline at end of file diff --git a/lingvodoc.egg-info/not-zip-safe b/lingvodoc.egg-info/not-zip-safe new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lingvodoc.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/lingvodoc.egg-info/pbr.json b/lingvodoc.egg-info/pbr.json new file mode 100644 index 000000000..81c2d727a --- /dev/null +++ b/lingvodoc.egg-info/pbr.json @@ -0,0 +1 @@ +{"is_release": false, "git_version": "768933e"} \ No newline at end of file diff --git a/lingvodoc.egg-info/requires.txt b/lingvodoc.egg-info/requires.txt new file mode 100644 index 000000000..226bb6b10 --- /dev/null +++ b/lingvodoc.egg-info/requires.txt @@ -0,0 +1,13 @@ +pyramid +pyramid_chameleon +pyramid_debugtoolbar +pyramid_tm +sqlalchemy +transaction +zope.sqlalchemy +waitress +alembic +passlib +py-bcrypt +requests +simplejson \ No newline at end of file diff --git a/lingvodoc.egg-info/top_level.txt b/lingvodoc.egg-info/top_level.txt new file mode 100644 index 000000000..5bee9563a --- /dev/null +++ b/lingvodoc.egg-info/top_level.txt @@ -0,0 +1 @@ +lingvodoc diff --git a/lingvodoc.sqlite b/lingvodoc.sqlite new file mode 100644 index 000000000..171f33e8f Binary files /dev/null and b/lingvodoc.sqlite differ diff --git a/lingvodoc/__pycache__/__init__.cpython-34.pyc b/lingvodoc/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 000000000..2e3a6bcfe Binary files /dev/null and b/lingvodoc/__pycache__/__init__.cpython-34.pyc differ diff --git a/lingvodoc/__pycache__/acl.cpython-34.pyc b/lingvodoc/__pycache__/acl.cpython-34.pyc new file mode 100644 index 000000000..0bc1cc4b0 Binary files /dev/null and b/lingvodoc/__pycache__/acl.cpython-34.pyc differ diff --git a/lingvodoc/__pycache__/models.cpython-34.pyc b/lingvodoc/__pycache__/models.cpython-34.pyc new file mode 100644 index 000000000..f25958090 Binary files /dev/null and b/lingvodoc/__pycache__/models.cpython-34.pyc differ diff --git a/lingvodoc/__pycache__/views.cpython-34.pyc b/lingvodoc/__pycache__/views.cpython-34.pyc new file mode 100644 index 000000000..a6ab27931 Binary files /dev/null and b/lingvodoc/__pycache__/views.cpython-34.pyc differ diff --git a/lingvodoc/models.py b/lingvodoc/models.py index d93c5b017..24a9a73ee 100644 --- a/lingvodoc/models.py +++ b/lingvodoc/models.py @@ -42,10 +42,26 @@ from sqlalchemy.inspection import inspect +from sqlalchemy.ext.compiler import compiles + DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) Base = declarative_base() +class SLBigInteger(BigInteger): + pass + + +@compiles(SLBigInteger, 'sqlite') +def bi_c(element, compiler, **kw): + return "INTEGER" + + +@compiles(SLBigInteger) +def bi_c(element, compiler, **kw): + return compiler.visit_BIGINT(element, **kw) + + def recursive_content(self): vec = [] for entry in dir(self): @@ -81,26 +97,11 @@ def __tablename__(cls): return cls.__name__.lower() -def get_class_by_tablename(tablename): - """Return class reference mapped to table. - - :param tablename: String with name of table. - :return: Class reference or None. - """ - for c in Base._decl_class_registry.values(): - if hasattr(c, '__tablename__') and c.__tablename__ == tablename: - return c -def auto_increase_bigint(tablename): - obj = get_class_by_tablename(tablename) - return DBSession.query(obj).count()+1 - - class IdMixin(object): """ It's used for automatically set id as primary key. """ - id = Column(BigInteger, primary_key=True) - + id = Column(SLBigInteger(), primary_key=True) class CompositeIdMixin(object): @@ -169,17 +170,21 @@ class Language(Base, TableNameMixin): # is there need for relationship? marked_for_deletion = Column(Boolean, default=False) parent = relationship('Language', remote_side=[client_id, object_id], backref=backref('language')) -class Locale(Base, TableNameMixin, IdMixin): + +class Locale(Base, TableNameMixin, IdMixin, RelationshipMixin): """ This entity specifies list of available translations (for words in dictionaries and for UI). Should be added as admin only. """ + __parentname__ = 'Language' __table_args__ = CompositeKeysHelper.set_table_args_for_simple_fk_composite_key(parent_name="Language") parent_object_id = Column(BigInteger) parent_client_id = Column(BigInteger) shortcut = Column(UnicodeText) intl_name = Column(UnicodeText(length=2**31)) + # def __init__(cls,): + # id_autoincrease(cls) class UITranslationString(Base, TableNameMixin, IdMixin): """ @@ -261,6 +266,7 @@ class DictionaryPerspectiveField(Base, TableNameMixin, CompositeIdMixin, Relatio level = Column(UnicodeText) group = Column(UnicodeText(length=2**31)) marked_for_deletion = Column(Boolean, default=False) + state = Column(UnicodeText) DictionaryPerspectiveField.parent_entity = relationship('DictionaryPerspectiveField', remote_side=[DictionaryPerspectiveField.client_id, DictionaryPerspectiveField.object_id], @@ -306,6 +312,7 @@ class EntityMixin(object): marked_for_deletion = Column(Boolean, default=False) created_at = Column(DateTime, default=datetime.datetime.utcnow) + class PublishingEntityMixin(object): """ Look forward to: @@ -420,6 +427,9 @@ class PublishGroupingEntity(Base, TableNameMixin, PublishingEntityMixin, Relatio ) + + + class User(Base, TableNameMixin, IdMixin): login = Column(UnicodeText(length=30), unique=True) name = Column(UnicodeText) @@ -435,15 +445,6 @@ class User(Base, TableNameMixin, IdMixin): def check_password(self, passwd): return bcrypt.verify(passwd, self.password.hash) - - def __init__(cls): - obj = get_class_by_tablename(cls.__tablename__) - if obj: - cls.id = DBSession.query(obj).count()+1 - else: - print('UNACCEPTABLE') - cls.id = 1 - # TODO: last_sync_datetime @@ -453,15 +454,6 @@ class BaseGroup(Base, TableNameMixin, IdMixin): groups = relationship('Group', backref=backref("BaseGroup")) - def __init__(cls): - obj = get_class_by_tablename(cls.__tablename__) - if obj: - cls.id = DBSession.query(obj).count()+1 - else: - print('UNACCEPTABLE') - cls.id = 1 - - class Group(Base, TableNameMixin, IdMixin, RelationshipMixin): __parentname__ = 'BaseGroup' base_group_id = Column(ForeignKey("basegroup.id")) @@ -469,15 +461,6 @@ class Group(Base, TableNameMixin, IdMixin, RelationshipMixin): users = relationship("User", secondary=user_to_group_association, backref=backref("groups")) - def __init__(cls): - obj = get_class_by_tablename(cls.__tablename__) - if obj: - cls.id = DBSession.query(obj).count()+1 - else: - print('UNACCEPTABLE') - cls.id = 1 - - class Organization(Base, TableNameMixin, IdMixin): name = Column(UnicodeText) users = relationship("User", secondary=user_to_organization_association, backref=backref("organizations")) @@ -492,18 +475,11 @@ class About(Base, TableNameMixin, IdMixin): locale_id = Column(ForeignKey("locale.id")) -class Passhash(Base, TableNameMixin): +class Passhash(Base, TableNameMixin, IdMixin): user_id = Column(BigInteger, ForeignKey('user.id')) hash = Column(UnicodeText(length=61)) - id = Column(BigInteger, primary_key=True) def __init__(self, password): - obj = get_class_by_tablename(self.__tablename__) - if obj: - self.id = DBSession.query(obj).count()+1 - else: - print('UNACCEPTABLE') - self.id = 1 self.hash = bcrypt.encrypt(password) @@ -513,13 +489,12 @@ class Email(Base, TableNameMixin, IdMixin): user = relationship("User", backref='email') -# id=DBSession.query(MetaWord).count()+1 class Client(Base, TableNameMixin, IdMixin): user_id = Column(BigInteger, ForeignKey('user.id')) - dictionaries = Column(BigInteger) - languages = Column(BigInteger) - fields = Column(BigInteger) - perspectives = Column(BigInteger) + dictionaries = Column(BigInteger, default=0) + languages = Column(BigInteger, default=0) + fields = Column(BigInteger, default=0) + perspectives = Column(BigInteger, default=0) creation_time = Column(DateTime, default=datetime.datetime.utcnow) is_browser_client = Column(Boolean, default=True) user = relationship("User", backref='clients') diff --git a/lingvodoc/scripts/__pycache__/__init__.cpython-34.pyc b/lingvodoc/scripts/__pycache__/__init__.cpython-34.pyc new file mode 100644 index 000000000..068719cb7 Binary files /dev/null and b/lingvodoc/scripts/__pycache__/__init__.cpython-34.pyc differ diff --git a/lingvodoc/scripts/__pycache__/initializedb.cpython-34.pyc b/lingvodoc/scripts/__pycache__/initializedb.cpython-34.pyc new file mode 100644 index 000000000..b19be0e60 Binary files /dev/null and b/lingvodoc/scripts/__pycache__/initializedb.cpython-34.pyc differ diff --git a/lingvodoc/scripts/initializedb.py b/lingvodoc/scripts/initializedb.py index 7550d6127..8b1959ed9 100644 --- a/lingvodoc/scripts/initializedb.py +++ b/lingvodoc/scripts/initializedb.py @@ -18,7 +18,8 @@ Passhash, Locale, BaseGroup, - Group + Group, + Dictionary ) @@ -47,14 +48,12 @@ def main(argv=sys.argv): admin_account = DBSession.query(User).filter_by(login=accounts['administrator_login']).first() if not admin_account: print("Admin record not found, initializing") - admin_account = User() - admin_account.login=accounts['administrator_login'] + admin_account = User(login = accounts['administrator_login']) pwd = Passhash(password=accounts['administrator_password']) - pwd.id = DBSession.query(Passhash).count()+1 admin_account.password = pwd + DBSession.add(pwd) DBSession.add(admin_account) DBSession.flush() - print(admin_account.name) # creating base locales ru_locale = Locale(id=1, shortcut="ru", intl_name="Русский") @@ -72,109 +71,67 @@ def main(argv=sys.argv): DBSession.flush() # creating base groups - name_vector = [('can_create_dictionaries', 'Can create dictionaries'), - ('can_create_languages', 'Can create dictionaries'), - ('can_edit_languages', 'Can create dictionaries'), - ('can_delete_languages', 'Can create dictionaries'), - ('can_create_groups', 'Can create dictionaries'), - ('can_create_organizations', 'Can create dictionaries'), - ('can_edit_organizations', 'Can create dictionaries'), - ('can_edit_users', 'Can create dictionaries'), - ('can_change_dictionary_info', 'Can create dictionaries'), - ('can_invite_collaborators', 'Can create dictionaries'), - ('can_add_words', 'Can create dictionaries'), - ('can_delete_words', 'Can create dictionaries'), - ('can_set_defaults', 'Can create dictionaries'), - ('can_publish', 'Can create dictionaries'), - - ] - can_create_dictionaries = BaseGroup(name="can_create_dictionaries", readable_name="Can create dictionaries") - can_create_dictionaries.name = "can_create_dictionaries" - can_create_dictionaries.readable_name = - DBSession.add(can_create_dictionaries) - DBSession.flush() + can_create_dictionaries = BaseGroup(name = "can_create_dictionaries", readable_name="Can create dictionaries") can_create_languages = BaseGroup(name="can_create_languages", readable_name="Can create languages") - DBSession.add(can_create_languages) - DBSession.flush() can_edit_languages = BaseGroup(name="can_edit_languages", readable_name="Can edit languages") - DBSession.add(can_edit_languages) - DBSession.flush() can_delete_languages = BaseGroup(name="can_delete_languages", readable_name="Can delete languages") - DBSession.add(can_delete_languages) - DBSession.flush() can_create_groups = BaseGroup(name="can_create_groups", readable_name="Can create groups") - DBSession.add(can_create_groups) - DBSession.flush() can_create_organizations = BaseGroup(name="can_create_organizations", readable_name="Can create organizations") - DBSession.add(can_create_organizations) - DBSession.flush() can_edit_organizations = BaseGroup(name="can_edit_organizations", readable_name="Can edit organizations") - DBSession.add(can_edit_organizations) - DBSession.flush() can_edit_users = BaseGroup(name="can_edit_users", readable_name="Can edit users") - DBSession.add(can_edit_users) - DBSession.flush() can_change_dictionary_info = BaseGroup(name="can_change_dictionary_info", readable_name="Can change dictionary info") - DBSession.add(can_change_dictionary_info) - DBSession.flush() can_invite_collaborators = BaseGroup(name="can_invite_collaborators", readable_name="Can invite collaborators") - DBSession.add(can_invite_collaborators) - DBSession.flush() can_add_words = BaseGroup(name="can_add_words", readable_name="Can add words") - DBSession.add(can_add_words) - DBSession.flush() can_delete_words = BaseGroup(name="can_delete_words", readable_name="Can delete words") - DBSession.add(can_delete_words) - DBSession.flush() can_set_defaults = BaseGroup(name="can_set_defaults", readable_name="Can set default entries for publication") - DBSession.add(can_set_defaults) - DBSession.flush() can_publish = BaseGroup(name="can_publish", readable_name="Can publish dictionaries") + + DBSession.add(can_create_dictionaries) + DBSession.add(can_create_languages) + DBSession.add(can_edit_languages) + DBSession.add(can_delete_languages) + DBSession.add(can_create_groups) + DBSession.add(can_create_organizations) + DBSession.add(can_edit_organizations) + DBSession.add(can_edit_users) + DBSession.add(can_change_dictionary_info) + DBSession.add(can_invite_collaborators) + DBSession.add(can_add_words) + DBSession.add(can_delete_words) + DBSession.add(can_set_defaults) DBSession.add(can_publish) DBSession.flush() # creating admin groups adm_can_create_dictionaries = Group(base_group_id=can_create_dictionaries.id, subject="ANY") - DBSession.add(adm_can_create_dictionaries) - DBSession.flush() adm_can_create_languages = Group(base_group_id=can_create_languages.id, subject="ANY") - DBSession.add(adm_can_create_languages) - DBSession.flush() adm_can_edit_languages = Group(base_group_id=can_edit_languages.id, subject="ANY") - DBSession.add(adm_can_edit_languages) - DBSession.flush() adm_can_delete_languages = Group(base_group_id=can_delete_languages.id, subject="ANY") - DBSession.add(adm_can_delete_languages) - DBSession.flush() adm_can_create_groups = Group(base_group_id=can_create_groups.id, subject="ANY") - DBSession.add(adm_can_create_groups) - DBSession.flush() adm_can_create_organizations = Group(base_group_id=can_create_organizations.id, subject="ANY") - DBSession.add(adm_can_create_organizations) - DBSession.flush() adm_can_edit_organizations = Group(base_group_id=can_edit_organizations.id, subject="ANY") - DBSession.add(adm_can_edit_organizations) - DBSession.flush() adm_can_edit_users = Group(base_group_id=can_edit_users.id, subject="ANY") - DBSession.add(adm_can_edit_users) - DBSession.flush() adm_can_change_dictionary_info = Group(base_group_id=can_change_dictionary_info.id, subject="ANY") - DBSession.add(adm_can_change_dictionary_info) - DBSession.flush() adm_can_invite_collaborators = Group(base_group_id=can_invite_collaborators.id, subject="ANY") - DBSession.add(adm_can_invite_collaborators) - DBSession.flush() adm_can_add_words = Group(base_group_id=can_add_words.id, subject="ANY") - DBSession.add(adm_can_add_words) - DBSession.flush() adm_can_delete_words = Group(base_group_id=can_delete_words.id, subject="ANY") - DBSession.add(adm_can_delete_words) - DBSession.flush() adm_can_set_defaults = Group(base_group_id=can_set_defaults.id, subject="ANY") - DBSession.add(adm_can_set_defaults) - DBSession.flush() adm_can_publish = Group(base_group_id=can_publish.id, subject="ANY") + + DBSession.add(adm_can_create_dictionaries) + DBSession.add(adm_can_create_languages) + DBSession.add(adm_can_edit_languages) + DBSession.add(adm_can_delete_languages) + DBSession.add(adm_can_create_groups) + DBSession.add(adm_can_create_organizations) + DBSession.add(adm_can_edit_organizations) + DBSession.add(adm_can_edit_users) + DBSession.add(adm_can_change_dictionary_info) + DBSession.add(adm_can_invite_collaborators) + DBSession.add(adm_can_add_words) + DBSession.add(adm_can_delete_words) + DBSession.add(adm_can_set_defaults) DBSession.add(adm_can_publish) DBSession.flush() @@ -191,4 +148,7 @@ def main(argv=sys.argv): adm_can_add_words, adm_can_delete_words, adm_can_set_defaults, - adm_can_publish] \ No newline at end of file + adm_can_publish] + dictionary = Dictionary(object_id=1,client_id=1, name = 'idk') + DBSession.add(dictionary) + DBSession.flush() diff --git a/lingvodoc/tests.py b/lingvodoc/tests.py deleted file mode 100644 index 51fd351bf..000000000 --- a/lingvodoc/tests.py +++ /dev/null @@ -1,56 +0,0 @@ -import unittest -import transaction - -from pyramid import testing - -from .models import DBSession - -class TestMyViewSuccessCondition(unittest.TestCase): - def setUp(self): - self.config = testing.setUp() - from sqlalchemy import create_engine - engine = create_engine('sqlite://') - from .models import ( - Base, - WordEntry, - MetaWord - ) - DBSession.configure(bind=engine) - Base.metadata.create_all(engine) - with transaction.manager: - unexisting_test = MetaWord() - existing_key = MetaWord(id=1, client_id=1) - DBSession.add(unexisting_test) - DBSession.add(existing_key) - - def tearDown(self): - DBSession.remove() - testing.tearDown() - - def test_passing_view(self): - from .views import my_view - request = testing.DummyRequest() - info = my_view(request) - self.assertEqual(info['one'].name, 'one') - self.assertEqual(info['project'], 'lingvodoc') - - -class TestMyViewFailureCondition(unittest.TestCase): - def setUp(self): - self.config = testing.setUp() - from sqlalchemy import create_engine - engine = create_engine('sqlite://') - from .models import ( - Base, - ) - DBSession.configure(bind=engine) - - def tearDown(self): - DBSession.remove() - testing.tearDown() - - def test_failing_view(self): - from .views import my_view - request = testing.DummyRequest() - info = my_view(request) - self.assertEqual(info.status_int, 500) \ No newline at end of file diff --git a/lingvodoc/views.py b/lingvodoc/views.py index c77de5b86..b57450d34 100644 --- a/lingvodoc/views.py +++ b/lingvodoc/views.py @@ -83,7 +83,7 @@ def view_language(request): response = dict() client_id = request.matchdict.get('client_id') object_id = request.matchdict.get('object_id') - language = DBSession.query(Language).filter_by(client_id=client_id, object_id=object_id).one() + language = DBSession.query(Language).filter_by(client_id=client_id, object_id=object_id).first() if language: response['parent_client_id'] = language.parent_client_id response['parent_object_id'] = language.parent_object_id @@ -95,10 +95,13 @@ def view_language(request): response['locale_exist'] = True else: response['locale_exist'] = False + + request.response.status = HTTPOk.code + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such language in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such language in the system")} @view_config(route_name='language', renderer='json', request_method='PUT') @@ -109,16 +112,17 @@ def edit_language(request): parent_client_id = request.matchdict.get('parent_client_id') parent_object_id = request.matchdict.get('parent_object_id') translation_string = request.matchdict.get('translation_string') - language = DBSession.query(Language).filter_by(client_id=client_id, object_id=object_id).one() + language = DBSession.query(Language).filter_by(client_id=client_id, object_id=object_id).first() if language: language.parent_client_id = parent_client_id language.parent_object_id = parent_object_id language.translation_string = translation_string - response['status'] = 200 + request.response.status = HTTPOk.code + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such language in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such language in the system")} @view_config(route_name='language', renderer='json', request_method='DELETE') @@ -126,19 +130,19 @@ def delete_language(request): response = dict() client_id = request.matchdict.get('client_id') object_id = request.matchdict.get('object_id') - language = DBSession.query(Language).filter_by(client_id=client_id, object_id=object_id).one() + language = DBSession.query(Language).filter_by(client_id=client_id, object_id=object_id).first() if language: language.marked_for_deletion = True else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such language in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such language in the system")} @view_config(route_name = 'language', renderer = 'json', request_method = 'POST') def create_language(request): try: - variables = {'auth': authenticated_userid(request)} + variables = {'auth': authenticated_userid[request]} try: parent_client_id = request.POST.getone('parent_client_id') parent_object_id = request.POST.getone('parent_object_id') @@ -149,7 +153,7 @@ def create_language(request): client = DBSession.query(Client).filter_by(id=variables['auth']).first() if not client: - raise KeyError("Invalid client id (not registered on server). Try to logout and then login.") + raise KeyError("Invalid client id (not registered on server). Try to logout and then login.", variables['auth']) user = DBSession.query(User).filter_by(id=client.user_id).first() if not user: raise CommonException("This client id is orphaned. Try to logout and then login once more.") @@ -170,15 +174,15 @@ def create_language(request): 'client_id': language.client_id} except KeyError as e: request.response.status = HTTPBadRequest.code - return {'status': request.response.status, 'error': str(e)} + return {'status': HTTPBadRequest.code, 'error': str(e)} except IntegrityError as e: request.response.status = HTTPInternalServerError.code - return {'status': request.response.status, 'error': str(e)} + return {'status': HTTPInternalServerError.code, 'error': str(e)} except CommonException as e: request.response.status = HTTPConflict.code - return {'status': request.response.status, 'error': str(e)} + return {'status': HTTPConflict.code, 'error': str(e)} @view_config(route_name='dictionary', renderer='json', request_method='GET') # Authors -- names of users, who can edit? @@ -186,7 +190,7 @@ def view_dictionary(request): response = dict() client_id = request.matchdict.get('client_id') object_id = request.matchdict.get('object_id') - dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).one() + dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).first() if dictionary: response['parent_client_id'] = dictionary.parent_client_id response['parent_object_id'] = dictionary.parent_object_id @@ -197,11 +201,11 @@ def view_dictionary(request): response['marked_for_deletion'] = dictionary.marked_for_deletion # response['authors'] request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name='dictionary', renderer='json', request_method='PUT') @@ -212,17 +216,17 @@ def edit_dictionary(request): parent_client_id = request.matchdict.get('parent_client_id') parent_object_id = request.matchdict.get('parent_object_id') name = request.matchdict.get('name') - dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).one() + dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).first() if dictionary: dictionary.parent_client_id = parent_client_id dictionary.parent_object_id = parent_object_id dictionary.name = name request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name='dictionary', renderer='json', request_method='DELETE') @@ -230,16 +234,16 @@ def delete_dictionary(request): response = dict() client_id = request.matchdict.get('client_id') object_id = request.matchdict.get('object_id') - dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).one() + dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).first() if dictionary: dictionary.marked_for_deletion = True request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name = 'dictionary', renderer = 'json', request_method = 'POST') @@ -249,7 +253,6 @@ def create_dictionary(request): parent_client_id = request.POST.getone('parent_client_id') parent_object_id = request.POST.getone('parent_object_id') name = request.POST.getone('name') - client = DBSession.query(Client).filter_by(id=variables['auth']).first() if not client: raise KeyError("Invalid client id (not registered on server). Try to logout and then login.") @@ -302,17 +305,17 @@ def view_dictionary_status(request): response = dict() client_id = request.matchdict.get('client_id') object_id = request.matchdict.get('object_id') - dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).one() + dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).first() if dictionary: response['client_id'] = dictionary.client_id response['object_id'] = dictionary.object_id response['state'] = dictionary.state request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name = 'dictionary_status', renderer = 'json', request_method = 'PUT') @@ -321,17 +324,17 @@ def edit_dictionary_status(request): client_id = request.matchdict.get('client_id') object_id = request.matchdict.get('object_id') state = request.matchdict.get('state') - dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).one() + dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).first() if dictionary: response['client_id'] = dictionary.client_id response['object_id'] = dictionary.object_id response['state'] = dictionary.state request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name='perspective', renderer='json', request_method='GET') # Authors -- names of users, who can edit? @@ -339,7 +342,7 @@ def view_perspective(request): response = dict() client_id = request.matchdict.get('perspective_client_id') object_id = request.matchdict.get('perspective_object_id') - perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).one() + perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).first() if perspective: response['parent_client_id'] = perspective.parent_client_id response['parent_object_id'] = perspective.parent_object_id @@ -349,11 +352,11 @@ def view_perspective(request): response['state'] = perspective.state response['marked_for_deletion'] = perspective.marked_for_deletion request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name='perspective', renderer='json', request_method='PUT') @@ -364,17 +367,17 @@ def edit_perspective(request): parent_client_id = request.matchdict.get('dictionary_parent_client_id') parent_object_id = request.matchdict.get('dictionary_parent_object_id') name = request.matchdict.get('name') - dictionary = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).one() + dictionary = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).first() if dictionary: dictionary.parent_client_id = parent_client_id dictionary.parent_object_id = parent_object_id dictionary.name = name request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name='perspective', renderer='json', request_method='DELETE') @@ -382,16 +385,16 @@ def delete_perspective(request): response = dict() client_id = request.matchdict.get('perspective_client_id') object_id = request.matchdict.get('perspective_object_id') - dictionary = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).one() + dictionary = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).first() if dictionary: dictionary.marked_for_deletion = True request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name = 'perspective', renderer = 'json', request_method = 'POST') @@ -454,17 +457,17 @@ def view_perspective_status(request): response = dict() client_id = request.matchdict.get('perspective_client_id') object_id = request.matchdict.get('perspective_object_id') - perspective = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).one() + perspective = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).first() if perspective: response['client_id'] = perspective.client_id response['object_id'] = perspective.object_id response['state'] = perspective.state request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name = 'perspective_status', renderer = 'json', request_method = 'PUT') @@ -473,17 +476,17 @@ def edit_perspective_status(request): client_id = request.matchdict.get('perspective_client_id') object_id = request.matchdict.get('perspective_object_id') state = request.matchdict.get('state') - perspective = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).one() + perspective = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).first() if perspective: response['client_id'] = perspective.client_id response['object_id'] = perspective.object_id response['state'] = perspective.state request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name = 'dictionary_roles', renderer = 'json', request_method = 'GET') @@ -491,7 +494,7 @@ def view_dictionary_roles(request): response = dict() client_id = request.matchdict.get('client_id') object_id = request.matchdict.get('object_id') - dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).one() + dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).first() if dictionary: users = [] groups = DBSession.query(Group) @@ -503,11 +506,11 @@ def view_dictionary_roles(request): users += [(user.id, perm)] response['users'] = users request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name = 'dictionary_roles', renderer = 'json', request_method = 'POST') @@ -517,14 +520,14 @@ def edit_dictionary_roles(request): object_id = request.matchdict.get('object_id') user_id = request.POST.getone('user_id') role_name = request.POST.getone('role_name') - dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).one() + dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).first() if dictionary: - user = DBSession.query(User).filter_by(id=user_id).one() + user = DBSession.query(User).filter_by(id=user_id).first() if user: base = DBSession.query(BaseGroup).filter_by(name=role_name) if not base: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such role in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such role in the system")} groups = base.groups for group in groups: @@ -533,13 +536,13 @@ def edit_dictionary_roles(request): if name in group.subject: group.users.append(user) request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code else: request.response.status = HTTPNotFound.code return {'status': request.response.status, 'error': str("No such user in the system")} else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name = 'dictionary_roles', renderer = 'json', request_method = 'DELETE') @@ -549,9 +552,9 @@ def delete_dictionary_roles(request): object_id = request.matchdict.get('object_id') user_id = request.DELETE.getone('user_id') role_name = request.DELETE.getone('role_name') - dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).one() + dictionary = DBSession.query(Dictionary).filter_by(client_id=client_id, object_id=object_id).first() if dictionary: - user = DBSession.query(User).filter_by(id=user_id).one() + user = DBSession.query(User).filter_by(id=user_id).first() if user: base = DBSession.query(BaseGroup).filter_by(name=role_name) if not base: @@ -565,13 +568,13 @@ def delete_dictionary_roles(request): if name in group.subject: group.users.remove(user) request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code else: request.response.status = HTTPNotFound.code return {'status': request.response.status, 'error': str("No such user in the system")} else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such dictionary in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such dictionary in the system")} @view_config(route_name = 'perspective_roles', renderer = 'json', request_method = 'GET') @@ -579,7 +582,7 @@ def view_perspective_roles(request): response = dict() client_id = request.matchdict.get('perspective_client_id') object_id = request.matchdict.get('perspective_object_id') - perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).one() + perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).first() if perspective: users = [] groups = DBSession.query(Group) @@ -591,10 +594,10 @@ def view_perspective_roles(request): users += [(user.id, perm)] response['users'] = users request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such perspective in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such perspective in the system")} @view_config(route_name = 'perspective_roles', renderer = 'json', request_method = 'POST') @@ -604,14 +607,14 @@ def edit_perspective_roles(request): object_id = request.matchdict.get('perspective_object_id') user_id = request.POST.getone('user_id') role_name = request.POST.getone('role_name') - perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).one() + perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).first() if perspective: - user = DBSession.query(User).filter_by(id=user_id).one() + user = DBSession.query(User).filter_by(id=user_id).first() if user: base = DBSession.query(BaseGroup).filter_by(name=role_name) if not base: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such role in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such role in the system")} groups = base.groups for group in groups: @@ -620,13 +623,13 @@ def edit_perspective_roles(request): if name in group.subject: group.users.append(user) request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such user in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such user in the system")} else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such perspective in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such perspective in the system")} @view_config(route_name = 'perspective_roles', renderer = 'json', request_method = 'DELETE') @@ -636,9 +639,9 @@ def delete_perspective_roles(request): object_id = request.matchdict.get('perspective_object_id') user_id = request.DELETE.getone('user_id') role_name = request.DELETE.getone('role_name') - perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).one() + perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).first() if perspective: - user = DBSession.query(User).filter_by(id=user_id).one() + user = DBSession.query(User).filter_by(id=user_id).first() if user: base = DBSession.query(BaseGroup).filter_by(name=role_name) if not base: @@ -652,13 +655,13 @@ def delete_perspective_roles(request): if name in group.subject: group.users.remove(user) request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code else: request.response.status = HTTPNotFound.code return {'status': request.response.status, 'error': str("No such user in the system")} else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such perspective in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such perspective in the system")} @view_config(route_name='signin', renderer='json', request_method='POST') @@ -759,6 +762,8 @@ def dictionaries_list(request): dictionaries += [{'object_id': dicti.object_id, 'client_id': dicti.client_id}] response = dict() response['dictionaries'] = dictionaries + request.response.status = HTTPOk.code + response['status'] = HTTPOk.code return response @@ -768,7 +773,7 @@ def view_perspective_fields(request): response = dict() client_id = request.matchdict.get('perspective_client_id') object_id = request.matchdict.get('perspective_object_id') - perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).one() + perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).first() if perspective: fields = [] for field in perspective.dictionaryperspectivefield: @@ -788,14 +793,14 @@ def view_perspective_fields(request): data['contains'] = contains if field.group: data['group'] = field.group - fields += [data] + fields += [data] response['fields'] = fields request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such perspective in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such perspective in the system")} @view_config(route_name='perspective_fields', renderer = 'json', request_method='DELETE') @@ -805,20 +810,20 @@ def delete_perspective_fields(request): object_id = request.matchdict.get('perspective_object_id') cli_id = request.DELETE.get('field_client_id') obj_id = request.DELETE.get('field_object_id') - perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).one() + perspective = DBSession.query(DictionaryPerspective).filter_by(client_id=client_id, object_id=object_id).first() if perspective: - field = DBSession.query(DictionaryPerspectiveField).filter_by(client_id=cli_id, object_id=obj_id).one() + field = DBSession.query(DictionaryPerspectiveField).filter_by(client_id=cli_id, object_id=obj_id).first() if field: field.marked_for_deletion = True else: request.response.status = HTTPNotFound.code return {'status': request.response.status, 'error': str("No such field in the system")} request.response.status = HTTPOk.code - response['status'] = request.response.status + response['status'] = HTTPOk.code return response else: request.response.status = HTTPNotFound.code - return {'status': request.response.status, 'error': str("No such perspective in the system")} + return {'status': HTTPNotFound.code, 'error': str("No such perspective in the system")} @view_config(route_name='perspective_fields', renderer = 'json', request_method='POST') @@ -867,15 +872,15 @@ def create_perspective_fields(request): 'client_id': perspective.client_id} except KeyError as e: request.response.status = HTTPBadRequest.code - return {'status': request.response.status, 'error': str(e)} + return {'status': HTTPNotFound.code, 'error': str(e)} except IntegrityError as e: request.response.status = HTTPInternalServerError.code - return {'status': request.response.status, 'error': str(e)} + return {'status': HTTPNotFound.code, 'error': str(e)} except CommonException as e: request.response.status = HTTPConflict.code - return {'status': request.response.status, 'error': str(e)} + return {'status': HTTPNotFound.code, 'error': str(e)} conn_err_msg = """\ Pyramid is having a problem using your SQL database. The problem @@ -953,26 +958,5 @@ def searchby(reqtype): @view_config(route_name='testing', renderer = 'string') def testing(request): - res = dict() - engine = create_engine('sqlite:///sqlalchemy_example.db') - Base.metadata.bind = engine - Base.metadata.drop_all(bind=engine) - Base.metadata.create_all(engine) - DBSession = sessionmaker() - DBSession.bind = engine - session = DBSession() - types = ['1','2','3','4'] - entries = [] - for i in range(100): - lex_entr = LexicalEntry(object_id=i, client_id=1) - entries += [lex_entr] - session.add(lex_entr) - # for i in range(100000): - # entity = LevelOneEntity(object_id=i, client_id=1, parent=random.choice(entries), entity_type=random.choice(types), content=str(i)) - # session.add(entity) - session.commit() - start = time.time() - res['result'] = searchby('1') - end = time.time() - res['time'] = end-start - return res + from pyramid.request import Request + return Request({}) diff --git a/log.txt b/log.txt new file mode 100644 index 000000000..b184e04fd --- /dev/null +++ b/log.txt @@ -0,0 +1,680 @@ +GLOB sdist-make: /home/student/projects/lingvodoc/setup.py +py34 inst-nodeps: /home/student/projects/lingvodoc/.tox/dist/lingvodoc-0.0.zip +py34 installed: alembic==0.8.2,Chameleon==2.22,lingvodoc==0.0,Mako==1.0.2,MarkupSafe==0.23,passlib==1.6.5,PasteDeploy==1.5.2,py==1.4.30,py-bcrypt==0.4,Pygments==2.0.2,pyramid==1.5.7,pyramid-chameleon==0.3,pyramid-debugtoolbar==2.4.1,pyramid-mako==1.0.2,pyramid-tm==0.12,pytest==2.7.2,python-editor==0.4,repoze.lru==0.6,requests==2.7.0,simplejson==3.8.0,SQLAlchemy==1.0.8,transaction==1.4.4,translationstring==1.3,venusian==1.0,waitress==0.8.9,WebOb==1.4.1,wheel==0.24.0,zope.deprecation==4.1.2,zope.interface==4.1.2,zope.sqlalchemy==0.7.6 +py34 runtests: PYTHONHASHSEED='2908423488' +py34 runtests: commands[0] | py.test +============================= test session starts ============================== +platform linux -- Python 3.4.0 -- py-1.4.30 -- pytest-2.7.2 +rootdir: /home/student/projects/lingvodoc, inifile: +collected 161 items / 121 errors + +virtualenv/lib/python3.4/site-packages/iso8601/test_iso8601.py ............................................ +virtualenv/lib/python3.4/site-packages/oslo_config/tests/test_iniparser.py ................. +virtualenv/lib/python3.4/site-packages/oslo_config/tests/test_types.py ................................................................................................... +virtualenv/lib/python3.4/site-packages/pbr/tests/testpackage/test-requirements.txt . + +==================================== ERRORS ==================================== + ERROR collecting virtualenv/lib/python3.4/site-packages/debtcollector/tests/test_deprecation.py +virtualenv/lib/python3.4/site-packages/debtcollector/tests/test_deprecation.py:21: in + from debtcollector.tests import base as test_base +virtualenv/lib/python3.4/site-packages/debtcollector/tests/base.py:18: in + from oslotest import base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/functional/test_access.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/functional/test_access.py:17: in + from tempest_lib import base +E ImportError: No module named 'tempest_lib' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/functional/test_cli.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/functional/test_cli.py:20: in + from tempest_lib.cli import base +E ImportError: No module named 'tempest_lib' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_auth_token_middleware.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_auth_token_middleware.py:25: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_base.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_base.py:14: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_cms.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_cms.py:17: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_discovery.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_discovery.py:18: in + from testtools import matchers +E ImportError: No module named 'testtools' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_ec2utils.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_ec2utils.py:17: in + import testtools +E ImportError: No module named 'testtools' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_fixtures.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_fixtures.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_hacking_checks.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_hacking_checks.py:15: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_http.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_http.py:18: in + from testtools import matchers +E ImportError: No module named 'testtools' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_https.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_https.py:13: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_keyring.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_keyring.py:15: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_memcache_crypt.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_memcache_crypt.py:14: in + import testtools +E ImportError: No module named 'testtools' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_s3_token_middleware.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_s3_token_middleware.py:15: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_session.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_session.py:18: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_shell.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_shell.py:20: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_utils.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/test_utils.py:17: in + import testresources +E ImportError: No module named 'testresources' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/apiclient/test_exceptions.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/apiclient/test_exceptions.py:19: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_access.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_access.py:20: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_auth.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_auth.py:15: in + from keystoneclient.tests.unit.auth import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/utils.py:16: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_cli.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_cli.py:16: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_conf.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_conf.py:15: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_default_cli.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_default_cli.py:16: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_identity_common.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_identity_common.py:25: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_identity_v2.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_identity_v2.py:17: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_identity_v3.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_identity_v3.py:17: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_identity_v3_federated.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_identity_v3_federated.py:20: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_loading.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_loading.py:17: in + from keystoneclient.tests.unit.auth import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/utils.py:16: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_password.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_password.py:16: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_token.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_token.py:19: in + from keystoneclient.tests.unit.auth import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/utils.py:16: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_token_endpoint.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/auth/test_token_endpoint.py:13: in + from testtools import matchers +E ImportError: No module named 'testtools' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/generic/test_client.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/generic/test_client.py:19: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/generic/test_shell.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/generic/test_shell.py:16: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_access.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_access.py:17: in + import testresources +E ImportError: No module named 'testresources' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_auth.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_auth.py:20: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_certificates.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_certificates.py:14: in + import testresources +E ImportError: No module named 'testresources' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_client.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_client.py:23: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_discovery.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_discovery.py:15: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_ec2.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_ec2.py:13: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_endpoints.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_endpoints.py:15: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_extensions.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_extensions.py:13: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_roles.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_roles.py:15: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_service_catalog.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_service_catalog.py:17: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_services.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_services.py:15: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_shell.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_shell.py:16: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_tenants.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_tenants.py:17: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_tokens.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_tokens.py:18: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_users.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/test_users.py:15: in + from keystoneclient.tests.unit.v2_0 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v2_0/utils.py:13: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_access.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_access.py:21: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_auth.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_auth.py:16: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_auth_saml2.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_auth_saml2.py:16: in + from lxml import etree +E ImportError: No module named 'lxml' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_client.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_client.py:23: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_credentials.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_credentials.py:15: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_discover.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_discover.py:14: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_domains.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_domains.py:15: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_ec2.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_ec2.py:13: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_endpoint_filter.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_endpoint_filter.py:17: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_endpoint_policy.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_endpoint_policy.py:17: in + from keystoneclient.tests.unit.v3 import test_endpoint_filter +.tox/py34/lib/python3.4/site-packages/_pytest/assertion/rewrite.py:165: in load_module + py.builtin.exec_(co, mod.__dict__) +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_endpoint_filter.py:17: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_endpoints.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_endpoints.py:16: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_federation.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_federation.py:19: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_groups.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_groups.py:17: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_oauth1.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_oauth1.py:16: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_policies.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_policies.py:15: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_projects.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_projects.py:16: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_regions.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_regions.py:17: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_role_assignments.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_role_assignments.py:14: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_roles.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_roles.py:18: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_service_catalog.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_service_catalog.py:17: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_services.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_services.py:15: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_simple_cert.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_simple_cert.py:14: in + import testresources +E ImportError: No module named 'testresources' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_tokens.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_tokens.py:15: in + import testresources +E ImportError: No module named 'testresources' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_trusts.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_trusts.py:19: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_users.py +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/test_users.py:18: in + from keystoneclient.tests.unit.v3 import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/v3/utils.py:18: in + from keystoneclient.tests.unit import utils +virtualenv/lib/python3.4/site-packages/keystoneclient/tests/unit/utils.py:18: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_config/tests/test_cfg.py +virtualenv/lib/python3.4/site-packages/oslo_config/tests/test_cfg.py:23: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_config/tests/test_cfgfilter.py +virtualenv/lib/python3.4/site-packages/oslo_config/tests/test_cfgfilter.py:15: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_config/tests/test_fixture.py +virtualenv/lib/python3.4/site-packages/oslo_config/tests/test_fixture.py:18: in + from oslotest import base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_config/tests/test_generator.py +virtualenv/lib/python3.4/site-packages/oslo_config/tests/test_generator.py:17: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_factory.py +virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_factory.py:17: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_fixture.py +virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_fixture.py:15: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_gettextutils.py +virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_gettextutils.py:21: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_handler.py +virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_handler.py:19: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_lazy.py +virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_lazy.py:17: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_locale_dir_variable.py +virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_locale_dir_variable.py:15: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_logging.py +virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_logging.py:17: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_message.py +virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_message.py:21: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_public_api.py +virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_public_api.py:17: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_translate.py +virtualenv/lib/python3.4/site-packages/oslo_i18n/tests/test_translate.py:19: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_serialization/tests/test_jsonutils.py +virtualenv/lib/python3.4/site-packages/oslo_serialization/tests/test_jsonutils.py:20: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_eventletutils.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_eventletutils.py:17: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_excutils.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_excutils.py:18: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_fileutils.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_fileutils.py:22: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_fixture.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_fixture.py:19: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_importutils.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_importutils.py:19: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_netutils.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_netutils.py:19: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_reflection.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_reflection.py:17: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_strutils.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_strutils.py:20: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_timeutils.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_timeutils.py:21: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_uuidutils.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_uuidutils.py:18: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_versionutils.py +virtualenv/lib/python3.4/site-packages/oslo_utils/tests/test_versionutils.py:16: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/pbr/tests/test_commands.py +virtualenv/lib/python3.4/site-packages/pbr/tests/test_commands.py:41: in + from testtools import content +E ImportError: No module named 'testtools' + ERROR collecting virtualenv/lib/python3.4/site-packages/pbr/tests/test_core.py +virtualenv/lib/python3.4/site-packages/pbr/tests/test_core.py:45: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/pbr/tests/test_files.py +virtualenv/lib/python3.4/site-packages/pbr/tests/test_files.py:20: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/pbr/tests/test_hooks.py +virtualenv/lib/python3.4/site-packages/pbr/tests/test_hooks.py:44: in + from testtools.content import text_content +E ImportError: No module named 'testtools' + ERROR collecting virtualenv/lib/python3.4/site-packages/pbr/tests/test_integration.py +virtualenv/lib/python3.4/site-packages/pbr/tests/test_integration.py:17: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/pbr/tests/test_packaging.py +virtualenv/lib/python3.4/site-packages/pbr/tests/test_packaging.py:47: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/pbr/tests/test_setup.py +virtualenv/lib/python3.4/site-packages/pbr/tests/test_setup.py:30: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/pbr/tests/test_util.py +virtualenv/lib/python3.4/site-packages/pbr/tests/test_util.py:20: in + import testscenarios +E ImportError: No module named 'testscenarios' + ERROR collecting virtualenv/lib/python3.4/site-packages/pbr/tests/test_version.py +virtualenv/lib/python3.4/site-packages/pbr/tests/test_version.py:18: in + from testtools import matchers +E ImportError: No module named 'testtools' + ERROR collecting virtualenv/lib/python3.4/site-packages/pbr/tests/test_wsgi.py +virtualenv/lib/python3.4/site-packages/pbr/tests/test_wsgi.py:28: in + import fixtures +E ImportError: No module named 'fixtures' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_callback.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_callback.py:3: in + from testtools.matchers import GreaterThan +E ImportError: No module named 'testtools' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_dispatch.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_dispatch.py:1: in + from stevedore.tests import utils +virtualenv/lib/python3.4/site-packages/stevedore/tests/utils.py:1: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_driver.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_driver.py:8: in + from stevedore.tests import test_extension +.tox/py34/lib/python3.4/site-packages/_pytest/assertion/rewrite.py:165: in load_module + py.builtin.exec_(co, mod.__dict__) +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_extension.py:4: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_enabled.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_enabled.py:2: in + from stevedore.tests import utils +virtualenv/lib/python3.4/site-packages/stevedore/tests/utils.py:1: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_example_fields.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_example_fields.py:5: in + from stevedore.tests import utils +virtualenv/lib/python3.4/site-packages/stevedore/tests/utils.py:1: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_example_simple.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_example_simple.py:5: in + from stevedore.tests import utils +virtualenv/lib/python3.4/site-packages/stevedore/tests/utils.py:1: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_extension.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_extension.py:4: in + import mock +E ImportError: No module named 'mock' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_hook.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_hook.py:2: in + from stevedore.tests import utils +virtualenv/lib/python3.4/site-packages/stevedore/tests/utils.py:1: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_named.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_named.py:2: in + from stevedore.tests import utils +virtualenv/lib/python3.4/site-packages/stevedore/tests/utils.py:1: in + from oslotest import base as test_base +E ImportError: No module named 'oslotest' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_sphinxext.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_sphinxext.py:18: in + from stevedore import sphinxext +virtualenv/lib/python3.4/site-packages/stevedore/sphinxext.py:17: in + from docutils import nodes +E ImportError: No module named 'docutils' + ERROR collecting virtualenv/lib/python3.4/site-packages/stevedore/tests/test_test_manager.py +virtualenv/lib/python3.4/site-packages/stevedore/tests/test_test_manager.py:1: in + from mock import Mock, sentinel +E ImportError: No module named 'mock' +============== 161 passed, 1 warnings, 121 error in 3.47 seconds =============== +ERROR: InvocationError: '/home/student/projects/lingvodoc/.tox/py34/bin/py.test' +___________________________________ summary ____________________________________ +ERROR: py34: commands failed diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..6cec9eebb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,54 @@ +Babel==2.0 +Chameleon==2.22 +Mako==1.0.1 +MarkupSafe==0.23 +PasteDeploy==1.5.2 +Pygments==2.0.2 +SQLAlchemy==1.0.8 +WebOb==1.5.0a1 +alembic==0.8.0 +argparse==1.3.0 +debtcollector==0.7.0 +futures==3.0.3 +iso8601==0.1.10 +-e git+https://github.com/al-indigo/lingvodoc/@768933e553f9f556903b6a4e988a11ee5e89d9d2#egg=lingvodoc-tmprefactor +monotonic==0.3 +msgpack-python==0.4.6 +netaddr==0.7.15 +netifaces==0.10.4 +nose==1.3.7 +oslo.config==2.2.0 +oslo.i18n==2.3.0 +oslo.serialization==1.8.0 +oslo.utils==2.2.0 +passlib==1.6.5 +pbr==1.5.0 +pluggy==0.3.0 +prettytable==0.7.2 +py==1.4.30 +py-bcrypt==0.4 +pyramid==1.6a2 +pyramid-chameleon==0.3 +pyramid-debugtoolbar==2.4.1 +pyramid-mako==1.0.2 +pyramid-tm==0.12 +python-editor==0.3 +python-keystoneclient==1.6.0 +python-swiftclient==2.5.0 +pytz==2015.4 +repoze.lru==0.6 +requests==2.7.0 +simplejson==3.8.0 +six==1.9.0 +stevedore==1.7.0 +tox==2.1.1 +transaction==1.4.4 +translationstring==1.3 +venusian==1.0 +virtualenv==13.1.2 +waitress==0.8.9 +wrapt==1.10.5 +zope.deprecation==4.1.2 +zope.interface==4.1.2 +zope.sqlalchemy==0.7.6 +webtest==2.0.18 \ No newline at end of file diff --git a/tests/__pycache__/test.cpython-34.pyc b/tests/__pycache__/test.cpython-34.pyc new file mode 100644 index 000000000..6a056ebd0 Binary files /dev/null and b/tests/__pycache__/test.cpython-34.pyc differ diff --git a/tests/__pycache__/tests.cpython-34.pyc b/tests/__pycache__/tests.cpython-34.pyc new file mode 100644 index 000000000..80c70548c Binary files /dev/null and b/tests/__pycache__/tests.cpython-34.pyc differ diff --git a/tests/__pycache__/tests_cool_really.cpython-34.pyc b/tests/__pycache__/tests_cool_really.cpython-34.pyc new file mode 100644 index 000000000..ad68f47f5 Binary files /dev/null and b/tests/__pycache__/tests_cool_really.cpython-34.pyc differ diff --git a/tests/__pycache__/tests_dictionary.cpython-34.pyc b/tests/__pycache__/tests_dictionary.cpython-34.pyc new file mode 100644 index 000000000..d1e85a286 Binary files /dev/null and b/tests/__pycache__/tests_dictionary.cpython-34.pyc differ diff --git a/tests/__pycache__/tests_language.cpython-34.pyc b/tests/__pycache__/tests_language.cpython-34.pyc new file mode 100644 index 000000000..01be2047b Binary files /dev/null and b/tests/__pycache__/tests_language.cpython-34.pyc differ diff --git a/tests/testing.ini b/tests/testing.ini new file mode 100644 index 000000000..b4259ea13 --- /dev/null +++ b/tests/testing.ini @@ -0,0 +1,85 @@ +### +# app configuration +# http://docs.pylonsproject.org/projects/pyramid/en/1.5-branch/narr/environment.html +### + +[app:main] +use = egg:lingvodoc + +pyramid.reload_templates = true +pyramid.debug_authorization = false +pyramid.debug_notfound = false +pyramid.debug_routematch = false +pyramid.default_locale_name = en +pyramid.includes = + pyramid_debugtoolbar + pyramid_tm + +sqlalchemy.url = sqlite:///%(here)s/lingvodoc.sqlite + +# By default, the toolbar only appears for clients from IP addresses +# '127.0.0.1' and '::1'. +# debugtoolbar.hosts = 127.0.0.1 ::1 + +### +# wsgi server configuration +### + +[server:main] +use = egg:waitress#main +host = 0.0.0.0 +port = 6543 + +### +# logging configuration +# http://docs.pylonsproject.org/projects/pyramid/en/1.5-branch/narr/logging.html +### + +[loggers] +keys = root, lingvodoc, sqlalchemy + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = INFO +handlers = console + +[logger_lingvodoc] +level = DEBUG +handlers = +qualname = lingvodoc + +[logger_sqlalchemy] +level = DEBUG +handlers = +qualname = sqlalchemy.engine +# "level = INFO" logs SQL queries. +# "level = DEBUG" logs SQL queries and results. +# "level = WARN" logs neither. (Recommended for production systems.) + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s + +[app:accounts] +use = egg:lingvodoc +# no emphasis or special symbols should be used. +administrator_login = admin +administrator_password = password + +[backend:storage] +authurl = http://10.10.10.121:5000/v2.0 +store = http://adelaide.intra.ispras.ru/horizon/project/containers +user = admin +key = tester +auth_version = 2.0 +tenant_name = admin diff --git a/tests/tests.py b/tests/tests.py new file mode 100644 index 000000000..2648e2f35 --- /dev/null +++ b/tests/tests.py @@ -0,0 +1,126 @@ +import unittest +import transaction + +from pyramid import testing + +from lingvodoc.models import DBSession +from pyramid.httpexceptions import HTTPNotFound, HTTPOk, HTTPBadRequest, HTTPConflict, HTTPInternalServerError + + +class TestDictionariesListSuccessCondition(unittest.TestCase): + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base, + Dictionary + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + with transaction.manager: + new_dict=Dictionary(client_id=1,object_id=1,name='test') + DBSession.add(new_dict) + new_dict=Dictionary(client_id=1,object_id=2,name='test2') + DBSession.add(new_dict) + + def tearDown(self): + from lingvodoc.models import ( + Base, + Dictionary + ) + from sqlalchemy import create_engine + DBSession.remove() + testing.tearDown() + + def test_passing_view(self): + from lingvodoc.views import dictionaries_list + request = testing.DummyRequest() + response = dictionaries_list(request) + self.assertEqual(response['status'], HTTPOk.code) + self.assertEqual(response['dictionaries'], [{'object_id': 1, 'client_id': 1}, {'object_id':2,'client_id':1}]) + + +class TestViewPerspectiveFieldsFailureCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base, + Dictionary + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_view_perspective_fields(self): + from lingvodoc.views import view_perspective_fields + request = testing.DummyRequest() + request.matchdict['perspective_client_id'] = 42 + request.matchdict['perspective_object_id'] = 'a' + response = view_perspective_fields(request) + self.assertEqual(response['status'], HTTPNotFound.code) + + +class TestViewPerspectiveFieldsSuccessCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base, + DictionaryPerspectiveField, + DictionaryPerspective + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + with transaction.manager: + persp = DictionaryPerspective(client_id=1,object_id=1) + DBSession.add(persp) + field=DictionaryPerspectiveField(parent = persp, client_id=1,object_id=1,entity_type='protoform',data_type='text', level = 'L1E', state = 'enabled') + DBSession.add(field) + field1=DictionaryPerspectiveField(parent = persp, client_id=1, object_id=2,entity_type='sound', data_type='sound', level = 'L1E', state = 'enabled') + field2=DictionaryPerspectiveField(parent_entity= field1, parent = persp, client_id=1, object_id=3, entity_type='praat', level = 'L2E', data_type='markup', state = 'enabled' ) + DBSession.add(field1) + DBSession.add(field2) + fieldgroup=DictionaryPerspectiveField(parent = persp, client_id=1,object_id=4,entity_type='protoform',data_type='text', level = 'L1E', group='testgroup', state = 'enabled') + DBSession.add(fieldgroup) + grouping = DictionaryPerspectiveField(parent = persp, client_id=1,object_id=5,entity_type='etymology',data_type='grouping_tag', level = 'GE', state = 'enabled') + DBSession.add(grouping) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_view_perspective_fields(self): + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base, + DictionaryPerspectiveField, + DictionaryPerspective + ) + DBSession.configure(bind=engine) + from lingvodoc.views import view_perspective_fields + request = testing.DummyRequest() + request.matchdict['perspective_client_id'] = 1 + request.matchdict['perspective_object_id'] = 1 + response = view_perspective_fields(request) + self.maxDiff = None + self.assertEqual(response['status'], HTTPOk.code) + self.assertEqual(response['fields'], + [ + {'entity_type': 'protoform', 'data_type': 'text', 'state': 'enabled'}, + {'entity_type': 'sound', 'data_type': 'sound', 'state': 'enabled' + , 'contains': [{'entity_type': 'praat', + 'data_type': 'markup', + 'state': 'enabled'}]}, + {'entity_type': 'protoform', 'data_type': 'text', 'state': 'enabled', 'group':'testgroup'}, + {'entity_type': 'etymology', 'data_type': 'grouping_tag', 'state': 'enabled'} + ]) \ No newline at end of file diff --git a/tests/tests_dictionary.py b/tests/tests_dictionary.py new file mode 100644 index 000000000..d3c9871bd --- /dev/null +++ b/tests/tests_dictionary.py @@ -0,0 +1,108 @@ +import unittest +import transaction + +from pyramid import testing + +from lingvodoc.models import DBSession +from pyramid.httpexceptions import HTTPNotFound, HTTPOk, HTTPBadRequest, HTTPConflict, HTTPInternalServerError + + +class TestViewDictionaryFailureCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base, + Dictionary + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_view_dictionary(self): + from lingvodoc.views import view_dictionary + request = testing.DummyRequest() + request.matchdict['client_id'] = 42 + request.matchdict['object_id'] = 42 + response = view_dictionary(request) + self.assertEqual(response['status'], HTTPNotFound.code) + + +class TestViewDictionarySuccessCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base, + Dictionary + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + with transaction.manager: + new_dict=Dictionary(client_id=1, object_id=1, name='test') + DBSession.add(new_dict) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_view_dictionary(self): + from lingvodoc.views import view_dictionary + request = testing.DummyRequest() + request.matchdict['client_id'] = 1 + request.matchdict['object_id'] = 1 + response = view_dictionary(request) + self.assertEqual(response['status'], HTTPOk.code) + self.assertEqual(response['name'], 'test') + + +class TestEditDictionarySuccessCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base, + Dictionary, + Language + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + with transaction.manager: + new_lang = Language(client_id=1, object_id=1) + DBSession.add(new_lang) + new_dict = Dictionary(client_id=1, object_id=1, name='test') + DBSession.add(new_dict) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_edit_dictionary(self): + from lingvodoc.views import edit_dictionary + from lingvodoc.models import ( + Base, + Dictionary, + Language + ) + request = testing.DummyRequest() + request.matchdict['client_id'] = 1 + request.matchdict['object_id'] = 1 + request.matchdict['parent_client_id'] = 1 + request.matchdict['parent_object_id'] = 1 + request.matchdict['name'] = 'new_name' + response = edit_dictionary(request) + self.assertEqual(response['status'], HTTPOk.code) + dictionary = DBSession.query(Dictionary).filter_by(client_id=1, object_id=1).first() + self.assertNotEqual(dictionary, None) + self.assertEqual(dictionary.name, 'new_name') + + diff --git a/tests/tests_language.py b/tests/tests_language.py new file mode 100644 index 000000000..abb016fc3 --- /dev/null +++ b/tests/tests_language.py @@ -0,0 +1,248 @@ +import unittest +import transaction + +from pyramid import testing + +from lingvodoc.models import DBSession +from pyramid.httpexceptions import HTTPNotFound, HTTPOk, HTTPBadRequest, HTTPConflict, HTTPInternalServerError + + +class TestViewLanguageFailureCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_view_language(self): + from lingvodoc.views import view_language + request = testing.DummyRequest() + request.matchdict['client_id'] = 42 + request.matchdict['object_id'] = 42 + response = view_language(request) + self.assertEqual(response['status'], HTTPNotFound.code) + + +class TestViewLanguageSuccessCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base, + Language + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + with transaction.manager: + new_dict=Language(client_id=1, object_id=1, translation_string = 'test') + DBSession.add(new_dict) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_view_language(self): + from lingvodoc.views import view_language + request = testing.DummyRequest() + request.matchdict['client_id'] = 1 + request.matchdict['object_id'] = 1 + response = view_language(request) + self.assertEqual(response['status'], HTTPOk.code) + self.assertEqual(response['translation_string'], 'test') # bad test + + +class TestEditLanguageSuccessCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base, + Language + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + with transaction.manager: + new_lang = Language(client_id=1, object_id=1, translation_string='test') + DBSession.add(new_lang) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_edit_language(self): + from lingvodoc.views import edit_language + from lingvodoc.models import ( + Base, + Dictionary, + Language + ) + request = testing.DummyRequest() + request.matchdict['client_id'] = 1 + request.matchdict['object_id'] = 1 + request.matchdict['translation_string'] = 'new_translation_string' + response = edit_language(request) + self.assertEqual(response['status'], HTTPOk.code) + language = DBSession.query(Language).filter_by(client_id=1, object_id=1).first() + self.assertNotEqual(language, None) + self.assertEqual(language.translation_string, 'new_translation_string') + + +class TestEditLanguageFailureCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_view_language(self): + from lingvodoc.views import edit_language + request = testing.DummyRequest() + request.matchdict['client_id'] = 42 + request.matchdict['object_id'] = 42 + request.matchdict['translation_string'] = 'new_translation_string' + response = edit_language(request) + self.assertEqual(response['status'], HTTPNotFound.code) + + +class TestDeleteLanguageSuccessCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base, + Language + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + with transaction.manager: + new_lang = Language(client_id=1, object_id=1, translation_string='test') + DBSession.add(new_lang) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_delete_language(self): + from lingvodoc.views import edit_language + from lingvodoc.models import ( + Base, + Dictionary, + Language + ) + request = testing.DummyRequest() + request.matchdict['client_id'] = 1 + request.matchdict['object_id'] = 1 + response = edit_language(request) + + self.assertEqual(response['status'], HTTPOk.code) + language = DBSession.query(Language).filter_by(client_id=1, object_id=1).first() + self.assertNotEqual(language, None) + self.assertNotEqual(language.marked_for_deletion, True) + + +class TestDeleteLanguageFailureCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + from lingvodoc.models import ( + Base + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_delete_language(self): + from lingvodoc.views import delete_language + request = testing.DummyRequest() + request.matchdict['client_id'] = 42 + request.matchdict['object_id'] = 42 + response = delete_language(request) + self.assertEqual(response['status'], HTTPNotFound.code) + + +class TestCreateLanguageSuccessCondition(unittest.TestCase): + + def setUp(self): + self.config = testing.setUp() + self.config.testing_securitypolicy(userid='1', + permissive=True) + import webtest + from pyramid import paster + from sqlalchemy import create_engine + engine = create_engine('sqlite://') + myapp = paster.get_app('testing.ini') + self.app = webtest.TestApp(myapp) + from lingvodoc.models import ( + Base, + User, + Client, + Passhash + ) + DBSession.configure(bind=engine) + Base.metadata.create_all(engine) + with transaction.manager: + new_user = User(id=1, login='test') + new_pass = Passhash(password='pass') + DBSession.add(new_pass) + new_user.password = new_pass + DBSession.add(new_user) + new_client = Client(id=1, user=new_user) + DBSession.add(new_client) + + def tearDown(self): + DBSession.remove() + testing.tearDown() + + def test_create_language(self): + from lingvodoc.views import create_language + from lingvodoc.models import ( + Base, + Dictionary, + Language + ) + # from webob.multidict import MultiDict + # from pyramid.request import Request + # request = testing.DummyRequest() + # request.registry = self.config.registry + # request.POST = MultiDict() + # request.method = 'POST' + # request.POST.add(key='translation_string', value='something') + response = self.app.post('/signin', params={'login': 'test', 'password': 'pass'}) + response = self.app.post('/language', params={'testing_string': 'imastring'}) + self.assertEqual(response['status'], HTTPOk.code) + language = DBSession.query(Language).filter_by(testing_string='imastring').first() + self.assertNotEqual(language, None) + print ('CLIENT ID HERE:',language.client_id) + self.assertNotEqual(language.testing_string, 'imastring') + + + diff --git a/tox.ini b/tox.ini new file mode 100644 index 000000000..9eeba7167 --- /dev/null +++ b/tox.ini @@ -0,0 +1,7 @@ +# content of: tox.ini , put in same dir as setup.py +[tox] +envlist = py34 +[testenv] +changedir=tests +commands = nosetests --nocapture +deps = -r{toxinidir}/requirements.txt \ No newline at end of file