Skip to content

Commit

Permalink
made template out of app
Browse files Browse the repository at this point in the history
  • Loading branch information
jeffersonheard committed Feb 4, 2014
2 parents db5b51f + 08562d8 commit abd8dad
Show file tree
Hide file tree
Showing 14 changed files with 45 additions and 282 deletions.
40 changes: 35 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,36 @@
*.pyc
*.pyo
*.db
.DS_Store
*.py[cod]

# C extensions
*.so

# Packages
*.egg
*.egg-info
dist
build
eggs
parts
bin
var
sdist
develop-eggs
.installed.cfg
lib
lib64
__pycache__

# Installer logs
pip-log.txt

# Unit test / coverage reports
.coverage
/static
.tox
nosetests.xml

# Translations
*.mo

# Mr Developer
.mr.developer.cfg
.project
.pydevproject
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
hs_app_template
===============

Hydroshare app template for Django
2 changes: 1 addition & 1 deletion admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
from django.contrib.gis import admin
from .models import *

admin.site.register(GenericResource, PageAdmin)
# admin.site.register(MyResource, PageAdmin)
Binary file modified migrations/0001_initial.pyc
Binary file not shown.
Binary file modified migrations/__init__.pyc
Binary file not shown.
281 changes: 5 additions & 276 deletions models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,283 +2,12 @@
from django.contrib.auth.models import User, Group
from django.db import models
from mezzanine.pages.models import Page, RichText
from ga_resources.models import PagePermissionsMixin
from mezzanine.core.models import Ownable
# from dublincore.models import QualifiedDublinCoreElement
from hs_core.models import AbstractResource

def get_user(request):
from tastypie.models import ApiKey
"""authorize user based on API key if it was passed, otherwise just use the request's user.
#
# To create a new resource, use these three super-classes.
#

:param request:
:return: django.contrib.auth.User
"""
if 'api_key' in request.REQUEST:
api_key = ApiKey.objects.get(key=request.REQUEST['api_key'])
return api_key.user
elif request.user.is_authenticated():
return User.objects.get(pk=request.user.pk)
else:
return request.user
# class MyResource(Page, RichText, AbstractResource)

class ResourcePermissionsMixin(Ownable):
creator = models.ForeignKey(User,
related_name='creator_of',
help_text='This is the person who first uploaded the resource',
)

public = models.BooleanField(
help_text='If this is true, the resource is viewable and downloadable by anyone',
default=True
)
owners = models.ManyToManyField(User,
related_name='owns',
help_text='The person who uploaded the resource'
)
frozen = models.BooleanField(
help_text='If this is true, the resource should not be modified',
default=False
)
do_not_distribute = models.BooleanField(
help_text='If this is true, the resource owner has to designate viewers',
default=True
)
discoverable = models.BooleanField(
help_text='If this is true, it will turn up in searches.',
default=True
)
published_and_frozen = models.BooleanField(
help_text="Once this is true, no changes can be made to the resource",
default=False
)

def storage_key(self, kfor):
return "{label}.{model}.{key}.{kfor}".format(
label=self._meta.app_label,
model=self._meta.module_name,
key=self.pk,
kfor=kfor
)

class Meta:
abstract = True

@property
def permissions_store(self):
return s.PERMISSIONS_DB

@property
def edit_users(self):
return set(self.permissions_store.smembers(self.storage_key('edit-users')))

@property
def edit_groups(self):
return set(self.permissions_store.smembers(self.storage_key('edit-groups')))

@property
def view_users(self):
return set(self.permissions_store.smembers(self.storage_key('view-users')))

@property
def view_groups(self):
return set(self.permissions_store.smembers(self.storage_key('view-groups')))


def add_edit_user(self, user):
self.permissions_store.sadd(self.storage_key('edit-users'), user if isinstance(user, int) else user.pk)


def add_view_user(self, user):
self.permissions_store.sadd(self.storage_key('view-users'), user if isinstance(user, int) else user.pk)


def add_edit_group(self, group):
self.permissions_store.sadd(self.storage_key('edit-groups'), group if isinstance(group, int) else group.pk)


def add_view_group(self, group):
self.permissions_store.sadd(self.storage_key('view-groups'), group if isinstance(group, int) else group.pk)


def remove_edit_user(self, user):
self.permissions_store.srem(self.storage_key('edit-users'), user if isinstance(user, int) else user.pk)


def remove_view_user(self, user):
self.permissions_store.srem(self.storage_key('view-users'), user if isinstance(user, int) else user.pk)


def remove_edit_group(self, group):
self.permissions_store.srem(self.storage_key('edit-groups'), group if isinstance(group, int) else group.pk)


def remove_view_group(self, group):
self.permissions_store.srem(self.storage_key('view-groups'), group if isinstance(group, int) else group.pk)

def can_add(self, request):
return self.can_change(request)

def can_delete(self, request):
return self.can_change(request)


def can_change(self, request):
user = get_user(request)

ret = True

if user.is_authenticated():
if not self.user:
ret = user.is_superuser
elif user.pk == self.user.pk:
ret = True
else:
users = self.edit_users
groups = self.edit_groups

if len(users) > 0 and user.pk in users:
ret = True
elif len(groups) > 0:
ret = user.groups.filter(pk__in=groups).exists()
else:
ret = False
else:
ret = False

return ret


def can_view(self, request):
user = get_user(request)

if self.public or not self.user:
return True
if user.is_authenticated():
if not self.user:
return user.is_superuser
elif user.pk == self.user.pk:
return True
else:
users = self.view_users
groups = self.view_groups

if len(users) > 0 and user.pk in users:
return True
elif len(groups) > 0:
return user.groups.filter(pk__in=groups).exists()
else:
return False
else:
return False

def copy_permissions_to_children(self, clear_existing=True, recurse=False):
# pedantically implemented. should use set logic to minimize changes, but ptobably not important
for child in self.children:
if isinstance(child, PagePermissionsMixin):
if clear_existing:
for u in child.edit_users:
child.remove_edit_user(u)
for u in child.view_users:
child.remove_view_user(u)
for g in child.edit_groups:
child.remove_edit_group(g)
for g in child.view_groups:
child.remove_view_group(g)

for u in self.edit_users:
child.add_edit_user(u)
for u in self.view_users:
child.add_view_user(u)
for g in self.edit_groups:
child.add_edit_group(g)
for g in self.view_groups:
child.add_view_group(g)

child.public = self.public
child.save()

if recurse:
child.copy_permissions_to_children(clear_existing=clear_existing, recurse=recurse)


def copy_permissions_from_parent(self, clear_existing=True):
parent = self.parent.get_content_model()
if isinstance(parent, PagePermissionsMixin):
if clear_existing:
for u in self.edit_users:
self.remove_edit_user(u)
for u in self.view_users:
self.remove_view_user(u)
for g in self.edit_groups:
self.remove_edit_group(g)
for g in self.view_groups:
self.remove_view_group(g)

for u in self.parent.edit_users:
self.add_edit_user(u)
for u in self.parent.view_users:
self.add_view_user(u)
for g in self.parent.edit_groups:
self.add_edit_group(g)
for g in self.parent.view_groups:
self.add_view_group(g)

self.public = self.parent.public
self.save()


# this should be used as the page processor for anything with pagepermissionsmixin
# page_processor_for(MyPage)(ga_resources.views.page_permissions_page_processor)
def page_permissions_page_processor(request, page):
page = page.get_content_model()
edit_groups = Group.objects.filter(pk__in=page.edit_groups)
view_groups = Group.objects.filter(pk__in=page.view_groups)
edit_users = User.objects.filter(pk__in=page.edit_users)
view_users = User.objects.filter(pk__in=page.view_users)

return {
"edit_groups": edit_groups,
"view_groups": view_groups,
"edit_users": edit_users,
"view_users": view_users,
}

class AbstractResource(ResourcePermissionsMixin):
"""
All hydroshare objects inherit from this mixin. It defines things that must
be present to be considered a hydroshare resource. Additionally, all
hydroshare resources should inherit from Page. This gives them what they
need to be represented in the Mezzanine CMS.
In some cases, it is possible that the order of inheritence matters. Best
practice dictates that you list pages.Page first and then other classes:
class MyResourceContentType(pages.Page, hs_core.AbstractResource):
...
"""
last_changed_by = models.ForeignKey(User,
help_text='The person who last changed the resource',
related_name='last_changed',
null=True)
dublin_metadata = generic.GenericRelation(
'dublincore.QualifiedDublinCoreElement',
help_text='The dublin core metadata of the resource'
)

class Meta:
abstract = True

class GenericResource(Page, RichText, AbstractResource):
resource_file = models.FileField(
help_text='This should be a Bagit file containing the resource itself',
upload_to='generic_resources',
blank=True,
null=True
)
resource_url = models.URLField(
blank=True,
null=True
)

class Meta:
verbose_name = 'Generic Hydroshare Resource'
Empty file added static/assets/.ignoreme
Empty file.
Empty file added static/css/.ignoreme
Empty file.
Empty file added static/img/.ignoreme
Empty file.
Empty file added static/js/.ignoreme
Empty file.
Empty file added static/theme/.ignoreme
Empty file.
Empty file.
Empty file added templates/includes/.ignoreme
Empty file.
Empty file added templates/pages/.ignoreme
Empty file.

0 comments on commit abd8dad

Please sign in to comment.