Skip to content

Commit

Permalink
Merge branch 'master' of github.com:brendonh/warp
Browse files Browse the repository at this point in the history
  • Loading branch information
brendonh committed Jun 2, 2011
2 parents caa71db + dc3052f commit dac9dd2
Show file tree
Hide file tree
Showing 113 changed files with 33,477 additions and 122 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
*~
*.pyc
.*.swp
build
dist
warp.egg-info
warp.egg-info
43 changes: 28 additions & 15 deletions warp/common/access.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from warp import runtime


def allowed(avatar, obj):
def allowed(avatar, obj, **kwargs):

if avatar is None:
roles = (runtime.config['roles'][x]
Expand All @@ -10,7 +10,7 @@ def allowed(avatar, obj):
roles = avatar.roles

for role in roles:
opinion = role.allows(obj)
opinion = role.allows(obj, **kwargs)
if opinion is not None:
return opinion

Expand All @@ -21,18 +21,19 @@ def allowed(avatar, obj):


class Role(object):
def __init__(self, ruleMap, default=[]):
def __init__(self, ruleMap, default=[], name=''):
self.ruleMap = ruleMap
self.default = default
self.name = name

def allows(self, obj):
def allows(self, obj, **kwargs):
if obj in self.ruleMap:
rules = self.ruleMap[obj]
else:
rules = self.default

for rule in rules:
opinion = rule.allows(obj)
opinion = rule.allows(obj, **kwargs)
if opinion is not None:
return opinion

Expand All @@ -45,9 +46,9 @@ class Combine(object):
def __init__(self, *checkers):
self.checkers = checkers

def allows(self, other):
return self.combiner(c.allows(other) for c in self.checkers)
def allows(self, other, **kwargs):
return self.combiner(c.allows(other, **kwargs) for c in self.checkers)


class All(Combine):
combiner = all
Expand All @@ -62,8 +63,8 @@ class Equals(object):

def __init__(self, key):
self.key = key
def allows(self, other):

def allows(self, other, **kwargs):
return self.key == other


Expand All @@ -72,19 +73,31 @@ class Callback(object):
def __init__(self, callback):
self.callback = callback

def allows(self, other):
def allows(self, other, **kwargs):
return self.callback(other)



# ---------------------------


class Allow(object):
def allows(self, other):
class Allow(object):
def allows(self, other, **kwargs):
return True


class Deny(object):
def allows(self, other):
def allows(self, other, **kwargs):
return False


class AllowFacets(object):

def __init__(self, facets):
self.facets = facets

def allows(self, other, facetName=None, **kwargs):
if not facetName:
# Always give permissions on the node
return True
return facetName in self.facets
19 changes: 11 additions & 8 deletions warp/common/avatar.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,20 @@ class Avatar(Storm):
def _getRoles(self):
if self._roles is None:
roleLookup = runtime.config['roles']
avatar_roles = runtime.store.find(
AvatarRole,
AvatarRole.avatar == self
).order_by(AvatarRole.position)
self._roles = tuple(
[roleLookup[ar.role_name]
for ar in runtime.store.find(
AvatarRole, AvatarRole.avatar == self
).order_by(AvatarRole.position)
] + [roleLookup[r] for r in
runtime.config['defaultRoles']])
for ar in avatar_roles if ar.role_name in roleLookup] +
[roleLookup[r] for r in
runtime.config['defaultRoles']]
)

return self._roles
roles = property(_getRoles)
roles = property(_getRoles)

def __repr__(self):
return "<Avatar '%s'>" % self.email.encode("utf-8")

Expand Down Expand Up @@ -83,7 +86,7 @@ class AvatarRole(Storm):

avatar_id = Int()
avatar = Reference(avatar_id, "Avatar.id")

role_name = RawStr()

position = Int()
2 changes: 1 addition & 1 deletion warp/crud/colproxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ def render_view(self, request):
def render_edit(self, request):
fieldName = self.fieldName()
field = '<input type="hidden" name="warpform-%s" class="warpform-upload" />' % fieldName
iframe = '<iframe name="%s" src="%s" width="300" height="30" id="iframe-%s"></iframe>' % (
iframe = '<iframe name="%s" src="%s" width="300" height="50" id="iframe-%s"></iframe>' % (
fieldName,
url(request.node, "uploadframe"),
fieldName)
Expand Down
1 change: 1 addition & 0 deletions warp/crud/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class CrudModel(object):
crudTitles = None

showListLink = True
allowCreate = True

gridAttrs = {
'rowNum': "10",
Expand Down
78 changes: 41 additions & 37 deletions warp/crud/render.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,10 @@
from twisted.web.error import NoResource
from twisted.web import static

from mako.template import Template

from storm.locals import Desc, Reference

from warp.runtime import store, templateLookup, internal, exposedStormClasses
from warp.runtime import (store, templateLookup, internal,
exposedStormClasses, config)
from warp import helpers
from warp.crud import form

Expand All @@ -23,8 +22,21 @@ class CrudRenderer(object):
def __init__(self, model):
self.model = model
self.crudModel = helpers.getCrudClass(model)
self.tinyTemplate = None


def getTinyTemplate(self):
if not self.tinyTemplate:
self.tinyTemplate = """
<html>
<head>
<link rel="stylesheet" href="%s/_warp/reset.css" type="text/css"></link>
</head>
<body>
%%s
</body>
</html>
""" % config.get("baseURL", '')
return self.tinyTemplate

def renderTemplate(self, request, templatePath):
objID = int(request.resource.args[0])
Expand All @@ -41,7 +53,7 @@ def renderLocalTemplate(self, request, filename):
# something in Mako's templateLookup dirs.
localNode = helpers.getCrudNode(self.crudModel).__file__
relPath = os.path.relpath(
os.path.dirname(localNode),
os.path.dirname(localNode),
os.path.abspath("templates"))
templatePath = "/%s/%s" % (relPath, filename)

Expand All @@ -50,10 +62,10 @@ def renderLocalTemplate(self, request, filename):


def render_index(self, request):
return helpers.renderTemplateObj(request,
return helpers.renderTemplateObj(request,
self._getListTemplate(),
model=self.crudModel,
allowCreate=True,
allowCreate=self.crudModel.allowCreate,
subTemplate="list.mak")


Expand All @@ -65,7 +77,7 @@ def render_list_json(self, request):
# XXX Todo -- Search

sortCol = getattr(self.model, params['sidx'])

if isinstance(sortCol, Reference):
sortCol = sortCol._local_key[0]

Expand All @@ -84,32 +96,32 @@ def render_list_json(self, request):
conditions.append(getattr(self.model, k) == v)

totalResults = store.find(self.model, *conditions).count()

results = list(store.find(self.model, *conditions).order_by(sortCol)[start:end])

exclude = json.loads(request.args.get('exclude', ['[]'])[0])

makeRow = lambda row: [row.renderListView(colName, request)
for colName in row.listColumns
if colName not in exclude]

rows = [{'id': '.'.join(str(getattr(row, k)) for k in row.__storm_primary__)
rows = [{'id': '.'.join(str(getattr(row, k)) for k in row.__storm_primary__)
if hasattr(row, '__storm_primary__')
else row.id,
else row.id,
'cell': makeRow(self.crudModel(row))}
for row in results]

(totalPages, addOne) = divmod(totalResults, rowsPerPage)
if addOne: totalPages += 1


obj = {
'total': totalPages,
'page': params['page'],
'records': len(results),
'rows': rows,
}

return json.dumps(obj)


Expand All @@ -121,7 +133,7 @@ def _getListTemplate(self):
# lookup=templateLookup,
# output_encoding="utf-8")
return internal['crudListTemplate']


def _getViewTemplate(self):
if 'crudTemplate' not in internal:
Expand All @@ -135,10 +147,10 @@ def _getViewTemplate(self):
_getEditTemplate = _getViewTemplate


def render_view(self, request):
def render_view(self, request):
objID = int(request.resource.args[0])
obj = store.get(self.model, objID)

return helpers.renderTemplateObj(request,
self._getViewTemplate(),
crud=self.crudModel(obj),
Expand All @@ -161,7 +173,7 @@ def render_edit(self, request):
def render_save(self, request):
objects = json.load(request.content)
(success, info) = form.applyForm(objects, request)

if not success:
store.rollback()
return json.dumps({
Expand All @@ -177,7 +189,7 @@ def render_save(self, request):
return json.dumps({
'success': False,
'errors': [(None, "Database error: %s" % e.message)]})


results = dict((k, [o.id for o in v])
for (k,v) in info.iteritems())
Expand Down Expand Up @@ -205,7 +217,11 @@ def render_create(self, request, template=None):
for (k,v) in presets.iteritems():
setattr(fakeObj, k, v)

return helpers.renderTemplateObj(request, template,
defaulter = getattr(fakeObj, "__warp_setdefaults__", None)
if defaulter is not None:
defaulter()

return helpers.renderTemplateObj(request, template,
crud=self.crudModel(fakeObj))


Expand All @@ -231,9 +247,9 @@ def render_image(self, request):
import traceback
traceback.print_exc()
return NoResource().render(request)

val = getattr(obj, attrName)

if val is None:
return NoResource().render(request)
else:
Expand All @@ -248,7 +264,7 @@ def render_uploadframe(self, request):
<input type="hidden" name="submitID" value="" />
<input type="hidden" name="callbackID" value="" />
</form>""" % helpers.url(request.node, "uploadfile")
return tinyTemplate % form
return self.getTinyTemplate() % form


def render_uploadfile(self, request):
Expand All @@ -265,20 +281,8 @@ def render_uploadfile(self, request):
submitID = request.args['submitID'][0]
callbackID = request.args['callbackID'][0]

return tinyTemplate % """
return self.getTinyTemplate() % """
<em style="line-height: 1.5em; color: #090; font-weight: normal;">[Uploaded OK]</em>
<script type="text/javascript">
parent.jQuery.fn.warpform.submissionCallbacks[%s](%s, "%s");
</script>""" % (submitID, callbackID, tfName)


tinyTemplate = """
<html>
<head>
<link rel="stylesheet" href="/_warp/reset.css" type="text/css"></link>
</head>
<body>
%s
</body>
</html>
"""
2 changes: 1 addition & 1 deletion warp/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ def url(node, facet="index", args=(), query=()):
segments = nodeSegments(node)
segments.append(facet)
segments.extend(args)
u = "/%s" % ("/".join(map(str, segments)))
u = "%s/%s" % (config.get('baseURL', ''), "/".join(map(str, segments)))
if query:
u = "%s?%s" % (u, urllib.urlencode(query))
return u
Expand Down
1 change: 1 addition & 0 deletions warp/static/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*.bak
Loading

0 comments on commit dac9dd2

Please sign in to comment.