Skip to content

Commit

Permalink
Merge pull request #23 from hugobessa/dev
Browse files Browse the repository at this point in the history
Deploy to PyPI
  • Loading branch information
hugobessa committed Oct 31, 2017
2 parents 91e0e77 + 641b3a5 commit 0849e81
Show file tree
Hide file tree
Showing 21 changed files with 378 additions and 159 deletions.
17 changes: 6 additions & 11 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,23 @@
language: python

python:
- "3.5"
- "3.6"

env:
- TOX_ENV=py35-django-18
- TOX_ENV=py34-django-18
- TOX_ENV=py27-django-18
- TOX_ENV=py35-django-19
- TOX_ENV=py34-django-19
- TOX_ENV=py27-django-19
- TOX_ENV=py36-django-110
- TOX_ENV=py35-django-110
- TOX_ENV=py34-django-110
- TOX_ENV=py27-django-110
- TOX_ENV=py36-django-111
- TOX_ENV=py35-django-111
- TOX_ENV=py34-django-111
- TOX_ENV=py27-django-111

matrix:
fast_finish: true

# command to install dependencies, e.g. pip install -r requirements.txt --use-mirrors
install: pip install -r requirements_test.txt

install:
- pip install -r requirements_test.txt
- pyenv local 2.7 3.5 3.6
# command to run tests using coverage, e.g. python setup.py test
script: tox -e $TOX_ENV -- --keepdb --parallel

Expand Down
8 changes: 4 additions & 4 deletions CONTRIBUTING.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Contributing
============

Contributions are welcome, and they are greatly appreciated! Every
little bit helps, and credit will always be given.
little bit helps, and credit will always be given.

You can contribute in many ways:

Expand Down Expand Up @@ -36,7 +36,7 @@ is open to whoever wants to implement it.
Write Documentation
~~~~~~~~~~~~~~~~~~~

Django Shared Schema Tenants could always use more documentation, whether as part of the
Django Shared Schema Tenants could always use more documentation, whether as part of the
official Django Shared Schema Tenants docs, in docstrings, or even on the web in blog posts,
articles, and such.

Expand Down Expand Up @@ -81,7 +81,7 @@ Ready to contribute? Here's how to set up `django-shared-schema-tenants` for loc
$ python setup.py test
$ tox

To get flake8 and tox, just pip install them into your virtualenv.
To get flake8 and tox, just pip install them into your virtualenv.

6. Commit your changes and push your branch to GitHub::

Expand All @@ -100,7 +100,7 @@ Before you submit a pull request, check that it meets these guidelines:
2. If the pull request adds functionality, the docs should be updated. Put
your new functionality into a function with a docstring, and add the
feature to the list in README.rst.
3. The pull request should work for Python 2.7, 3.4 and 3.5 and for PyPy. Check
3. The pull request should work for Python 2.7, 3.5 and 3.6 and for PyPy. Check
https://travis-ci.org/hugobessa/django-shared-schema-tenants/pull_requests
and make sure that the tests pass for all supported Python versions.

Expand Down
7 changes: 7 additions & 0 deletions exampleproject/exampleproject/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,10 @@
SHARED_SCHEMA_TENANTS = {
'DEFAULT_TENANT_SLUG': 'default',
}


AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'shared_schema_tenants.auth_backends.TenantModelBackend'
]

1 change: 1 addition & 0 deletions requirements_test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ coverage==4.3.4
mock>=1.0.1
flake8>=2.1.0
tox>=1.7.0
tox-pyenv>=1.1.0
codecov>=2.0.0
django-model-utils>=2.0
djangorestframework
Expand Down
4 changes: 1 addition & 3 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,6 @@ def get_version(*file_paths):
classifiers=[
'Development Status :: 3 - Alpha',
'Framework :: Django',
'Framework :: Django :: 1.8',
'Framework :: Django :: 1.9',
'Framework :: Django :: 1.10',
'Framework :: Django :: 1.11',
'Intended Audience :: Developers',
Expand All @@ -73,7 +71,7 @@ def get_version(*file_paths):
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
],
)
7 changes: 3 additions & 4 deletions shared_schema_tenants/helpers/tenant_extra_data.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from shared_schema_tenants.settings import (
DEFAULT_TENANT_EXTRA_DATA_FIELDS, DEFAULT_TENANT_EXTRA_DATA)
from shared_schema_tenants.settings import get_setting

from shared_schema_tenants.helpers.tenant_json_field import TenantJSONFieldHelper

Expand All @@ -9,5 +8,5 @@ class TenantExtraDataHelper(TenantJSONFieldHelper):
def __init__(self, instance=None):
super(TenantExtraDataHelper, self).__init__(
instance_field_name='extra_data', instance=instance,
tenant_fields=DEFAULT_TENANT_EXTRA_DATA_FIELDS,
tenant_default_fields_values=DEFAULT_TENANT_EXTRA_DATA)
tenant_fields=get_setting('DEFAULT_TENANT_EXTRA_DATA_FIELDS'),
tenant_default_fields_values=get_setting('DEFAULT_TENANT_EXTRA_DATA'))
5 changes: 4 additions & 1 deletion shared_schema_tenants/helpers/tenant_json_field.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import sys
from django.core.exceptions import ValidationError
from django.utils.text import ugettext_lazy as _
from shared_schema_tenants.exceptions import TenantFieldTypeConfigurationError
Expand All @@ -24,6 +25,9 @@ def __init__(self, instance_field_name, instance=None,
self.tenant_fields = tenant_fields
self.tenant_default_fields_values = tenant_default_fields_values

if sys.version_info < (3, 4):
self.TYPES_TO_INTERNAL_MAP['string'].append(type(u''))

def get_tenant_fields(self):
return getattr(self, 'tenant_fields', {})

Expand Down Expand Up @@ -72,7 +76,6 @@ def validate_field(self, context, key, value, original_value=None):
_('This field is required')
]
})

if type(value) not in self.TYPES_TO_INTERNAL_MAP[field_type]:
raise ValidationError({
key: [
Expand Down
13 changes: 4 additions & 9 deletions shared_schema_tenants/helpers/tenant_relationships.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,9 @@
def create_relationship(tenant, user, groups=[], permissions=[]):
with transaction.atomic():
relationship = TenantRelationship.objects.create(user=user, tenant=tenant)
try:
relationship.groups.set(groups)
relationship.permissions.set(permissions)
except AttributeError:
# compatibility with old django 1.8 and 1.9
for group in groups:
relationship.groups.add(group)
for perm in permissions:
relationship.permissions.add(perm)
for group in groups:
relationship.groups.add(group)
for perm in permissions:
relationship.permissions.add(perm)

return relationship
7 changes: 3 additions & 4 deletions shared_schema_tenants/helpers/tenant_settings.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from shared_schema_tenants.settings import (
DEFAULT_TENANT_SETTINGS_FIELDS, DEFAULT_TENANT_SETTINGS)
from shared_schema_tenants.settings import get_setting

from shared_schema_tenants.helpers.tenant_json_field import TenantJSONFieldHelper

Expand All @@ -9,5 +8,5 @@ class TenantSettingsHelper(TenantJSONFieldHelper):
def __init__(self, instance=None):
super(TenantSettingsHelper, self).__init__(
instance_field_name='settings', instance=instance,
tenant_fields=DEFAULT_TENANT_SETTINGS_FIELDS,
tenant_default_fields_values=DEFAULT_TENANT_SETTINGS)
tenant_fields=get_setting('DEFAULT_TENANT_SETTINGS_FIELDS'),
tenant_default_fields_values=get_setting('DEFAULT_TENANT_SETTINGS'))
4 changes: 2 additions & 2 deletions shared_schema_tenants/helpers/tenants.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from django.contrib.auth.models import Group, Permission
from django.db import transaction

from shared_schema_tenants.settings import DEFAULT_TENANT_OWNER_PERMISSIONS
from shared_schema_tenants.settings import get_setting


def get_current_tenant():
Expand Down Expand Up @@ -58,7 +58,7 @@ def create_default_tenant_groups():
group, created = Group.objects.get_or_create(name='tenant_owner')

if created:
for perm in DEFAULT_TENANT_OWNER_PERMISSIONS:
for perm in get_setting('DEFAULT_TENANT_OWNER_PERMISSIONS'):
try:
group.permissions.add(Permission.objects.get(
content_type__app_label=perm.split('.')[0],
Expand Down
4 changes: 2 additions & 2 deletions shared_schema_tenants/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from django.contrib.sites.shortcuts import get_current_site
from django.contrib.sites.models import Site
from django.utils.functional import SimpleLazyObject
from shared_schema_tenants.settings import TENANT_HTTP_HEADER
from shared_schema_tenants.settings import get_setting
from shared_schema_tenants.models import Tenant, TenantSite

if platform.python_version_tuple()[0] == '2':
Expand All @@ -20,7 +20,7 @@ def get_tenant(request):
pass

try:
tenant_http_header = 'HTTP_' + TENANT_HTTP_HEADER.replace('-', '_').upper()
tenant_http_header = 'HTTP_' + get_setting('TENANT_HTTP_HEADER').replace('-', '_').upper()
request._cached_tenant = Tenant.objects.get(slug=request.META[tenant_http_header])
except LookupError:
lazy_tenant = TenantMiddleware.get_current_tenant()
Expand Down
25 changes: 8 additions & 17 deletions shared_schema_tenants/mixins.py
Original file line number Diff line number Diff line change
@@ -1,45 +1,36 @@
from django.db import models
import django.utils.version
from shared_schema_tenants.settings import DEFAULT_TENANT_SLUG
from shared_schema_tenants.settings import get_setting
from shared_schema_tenants.managers import SingleTenantModelManager, MultipleTenantModelManager
from shared_schema_tenants.models import Tenant


def get_default_tenant():
return Tenant.objects.filter(slug=DEFAULT_TENANT_SLUG).first()
return Tenant.objects.filter(slug=get_setting('DEFAULT_TENANT_SLUG')).first()


class SingleTenantModelMixin(models.Model):
tenant = models.ForeignKey('shared_schema_tenants.Tenant', default=get_default_tenant)

if django.utils.version.get_complete_version()[1] < 10:
objects = models.Manager()
else:
objects = SingleTenantModelManager()
objects = SingleTenantModelManager()

original_manager = models.Manager()
tenant_objects = SingleTenantModelManager()

class Meta:
abstract = True
if django.utils.version.get_complete_version()[1] >= 10:
default_manager_name = 'original_manager'
base_manager_name = 'original_manager'
default_manager_name = 'original_manager'
base_manager_name = 'original_manager'


class MultipleTenantsModelMixin(models.Model):
tenants = models.ManyToManyField('shared_schema_tenants.Tenant')

if django.utils.version.get_complete_version()[1] < 10:
objects = models.Manager()
else:
objects = MultipleTenantModelManager()
objects = MultipleTenantModelManager()

tenant_objects = MultipleTenantModelManager()
original_manager = models.Manager()

class Meta:
abstract = True
if django.utils.version.get_complete_version()[1] >= 10:
default_manager_name = 'original_manager'
base_manager_name = 'original_manager'
default_manager_name = 'original_manager'
base_manager_name = 'original_manager'
13 changes: 6 additions & 7 deletions shared_schema_tenants/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,13 @@
from django.contrib.sites.models import Site
from django.db.models.signals import post_delete


import json

from model_utils.models import TimeStampedModel

from shared_schema_tenants.managers import (
SingleTenantModelManager)
from shared_schema_tenants.settings import DEFAULT_TENANT_SETTINGS, DEFAULT_TENANT_EXTRA_DATA
from shared_schema_tenants.settings import get_setting
from shared_schema_tenants.validators import validate_json


Expand All @@ -21,16 +20,16 @@ class Tenant(TimeStampedModel):
if 'postgresql' in django_settings.DATABASES['default']['ENGINE']:
from django.contrib.postgres.fields import JSONField
extra_data = JSONField(blank=True, null=True,
default=DEFAULT_TENANT_EXTRA_DATA)
default=get_setting('DEFAULT_TENANT_EXTRA_DATA'))
settings = JSONField(blank=True, null=True,
default=DEFAULT_TENANT_SETTINGS)
default=get_setting('DEFAULT_TENANT_SETTINGS'))
else:
_extra_data = models.TextField(blank=True, null=True,
validators=[validate_json],
default=json.dumps(DEFAULT_TENANT_EXTRA_DATA))
default=json.dumps(get_setting('DEFAULT_TENANT_EXTRA_DATA')))
_settings = models.TextField(blank=True, null=True,
validators=[validate_json],
default=json.dumps(DEFAULT_TENANT_SETTINGS))
default=json.dumps(get_setting('DEFAULT_TENANT_SETTINGS')))

@property
def extra_data(self):
Expand Down Expand Up @@ -87,4 +86,4 @@ def __str__(self):
return '%s - %s (%s)' % (str(self.user), str(self.tenant), groups_str)

class Meta:
unique_together = [['user', 'tenant']]
unique_together = [('user', 'tenant')]

0 comments on commit 0849e81

Please sign in to comment.