Commits

Colin Copeland committed 9778e34

perm app

  • Participants

Comments (0)

Files changed (9)

__init__.py

Empty file added.
+#!/usr/bin/env python
+from django.core.management import execute_manager
+try:
+    import settings # Assumed to be in the same directory.
+except ImportError:
+    import sys
+    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+    sys.exit(1)
+
+if __name__ == "__main__":
+    execute_manager(settings)

perms/__init__.py

Empty file added.
+from django.conf import settings
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.auth.models import User
+
+from perms.models import ObjectPermission
+
+
+class ObjectPermBackend(object):
+    supports_object_permissions = True
+    supports_anonymous_user = True
+
+    def authenticate(self, username, password):
+        return None
+
+    def has_perm(self, user_obj, perm, obj=None):
+        if not user_obj.is_authenticated():
+            user_obj = User.objects.get(pk=settings.ANONYMOUS_USER_ID)
+        if obj is None:
+            return False
+        ct = ContentType.objects.get_for_model(obj)
+        try:
+            perm = perm.split('.')[-1].split('_')[0]
+        except IndexError:
+            return False
+        p = ObjectPermission.objects.filter(content_type=ct,
+                                            object_id=obj.id,
+                                            user=user_obj)
+        return p.filter(action='can_%s' % perm).exists()
+from django.db import models
+from django.contrib.auth.models import User
+from django.contrib.contenttypes.models import ContentType
+
+
+PERMISSIONS = {
+    '__all__': ('view', 'change', 'delete'),
+    'decision': ('mark_as_finished',)
+}
+
+
+
+class ObjectPermission(models.Model):
+    ACTION_CHOICES= (
+        # all objects
+        ('can_view', 'Can view'),
+        ('can_change', 'Can change'),
+        ('can_delete', 'Can delete'),
+        
+        
+    )
+    
+    user = models.ForeignKey(User)
+    action = models.CharField(max_length=32, choices=ACTION_CHOICES)
+    content_type = models.ForeignKey(ContentType)
+    object_id = models.PositiveIntegerField()
+from django.test import TestCase
+from django.contrib.auth.models import User
+from django.contrib.contenttypes.models import ContentType
+
+from perms.models import ObjectPermission
+
+
+class SimpleTest(TestCase):
+    def setUp(self):
+        self.user = User.objects.create_user('test', 'test@abc.com', 'abc')
+        self.ct = ContentType.objects.get_for_model(self.user)
+    
+    def add_perm(self, name):
+        return ObjectPermission.objects.create(
+            user=self.user,
+            action='can_%s' % name,
+            content_type=self.ct,
+            object_id=self.user.id,
+        )
+    
+    def test_basic_addition(self):
+        self.assertFalse(self.user.has_perm('can_view', self.user))
+        self.add_perm('view')
+        self.assertTrue(self.user.has_perm('view', self.user))
+# Create your views here.
+# Django settings for mooo project.
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+    # ('Your Name', 'your_email@domain.com'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+DATABASE_NAME = 'test.db'             # Or path to database file if using sqlite3.
+DATABASE_USER = ''             # Not used with sqlite3.
+DATABASE_PASSWORD = ''         # Not used with sqlite3.
+DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
+
+AUTHENTICATION_BACKENDS = (
+    'django.contrib.auth.backends.ModelBackend',
+    'perms.backend.ObjectPermBackend',
+)
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'America/Chicago'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = ''
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/media/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = '^wid2-s#_emt4idum7p*a3k^7etv8@w11oc5a(pr&lj4xugl7f'
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+#     'django.template.loaders.eggs.load_template_source',
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+)
+
+ROOT_URLCONF = 'mooo.urls'
+
+TEMPLATE_DIRS = (
+    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
+    # Always use forward slashes, even on Windows.
+    # Don't forget to use absolute paths, not relative paths.
+)
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+    'django.contrib.admin',
+    'perms',
+)
+from django.conf.urls.defaults import *
+
+# Uncomment the next two lines to enable the admin:
+from django.contrib import admin
+admin.autodiscover()
+
+urlpatterns = patterns('',
+    # Example:
+    # (r'^mooo/', include('mooo.foo.urls')),
+
+    # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
+    # to INSTALLED_APPS to enable admin documentation:
+    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
+
+    # Uncomment the next line to enable the admin:
+    (r'^admin/', include(admin.site.urls)),
+)