Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from collections import OrderedDict
import json


app = Flask(__name__)

from mako.lookup import TemplateLookup
Expand All @@ -16,6 +17,11 @@ def render(filename, **kwargs):
t = makolookup.get_template(filename).render(**kwargs)
return t

def value_or_pk(record):
if isinstance(record, models.StoredObject):
return record._primary_key
return record

def get_schema_keys(schema_name):
schema = models.StoredObject._collections[schema_name]
schema_keys = {k:v.__class__.__name__ for k,v in schema.__dict__.iteritems() if isinstance(v, Field)}
Expand All @@ -33,7 +39,7 @@ def schema_display(schema_name):
schema_obj = models.StoredObject._collections[schema_name]
primary_name = schema_obj._primary_name
schema_info = json.dumps(get_schema_keys(schema_name))
schema_entries = schema_obj.find_all()
schema_entries = schema_obj.find()
entry_data = []
for i in list(schema_entries):
storage = i.to_storage()
Expand Down Expand Up @@ -67,8 +73,8 @@ def edit(schema_name, sid):

if request.method == 'POST':
for key in data_dict.keys():
if key in json.loads(request.form['json_data']) and key is not "_backrefs":
incoming_data = json.loads(request.form['json_data'])
incoming_data = json.loads(request.form['json_data'])
if key in incoming_data and key is not "_backrefs":
field_type = type(schema_obj._fields[key]).__name__
if field_type is 'BooleanField':
new_value = incoming_data[key]
Expand Down Expand Up @@ -119,7 +125,6 @@ def edit(schema_name, sid):

if old_value != foreign_obj:
new_value = foreign_obj

setattr(schema_obj, key, new_value)

schema_obj.save()
Expand Down Expand Up @@ -158,7 +163,7 @@ def edit(schema_name, sid):
return render(
filename="edit.mako",
schema_name=schema_name,
schema_obj_data=data_dict,
schema_obj=schema_obj,
json_data=json.dumps(data_dict),
schema_primary_name=schema_class._primary_name,
message=message
Expand Down
43 changes: 18 additions & 25 deletions models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,11 @@

import pprint

from modularodm import StoredObject
from modularodm.fields.StringField import StringField
from modularodm.fields.IntegerField import IntegerField
from modularodm.fields.FloatField import FloatField
from modularodm.fields.BooleanField import BooleanField
from modularodm.fields.DateTimeField import DateTimeField
from modularodm.fields.ForeignField import ForeignField
from modularodm.storage.PickleStorage import PickleStorage
from modularodm.storage.MongoStorage import MongoStorage
from modularodm.validators import *
from modularodm.query.querydialect import DefaultQueryDialect as Q

from modularodm import StoredObject, fields, storage

pp = pprint.PrettyPrinter(indent=4)

import random
Expand All @@ -34,26 +27,26 @@
except:pass

class Team(StoredObject):
name = StringField(primary=True)
owner = ForeignField('Manager', backref='owned')
wins = IntegerField(list=True)
playoffs = BooleanField(default=None, list=True)
schedule = StringField(list=True)
players = ForeignField('Player', list=True, backref='plays_for')
name = fields.StringField(primary=True)
owner = fields.ForeignField('Manager', backref='owned')
wins = fields.IntegerField(list=True)
playoffs = fields.BooleanField(default=None, list=True)
schedule = fields.StringField(list=True)
players = fields.ForeignField('Player', list=True, backref='plays_for')

class Manager(StoredObject):
name = StringField(primary=True)
players_managed = ForeignField('Player', list=True, backref='managed_by')
name = fields.StringField(primary=True)
players_managed = fields.ForeignField('Player', list=True, backref='managed_by')

class Player(StoredObject):
name = StringField(primary=True)
number = IntegerField()
rating = FloatField(default=0.0)
injured = BooleanField(default=False)

Team.set_storage(PickleStorage('team'))
Manager.set_storage(PickleStorage('manager'))
Player.set_storage(PickleStorage('player'))
name = fields.StringField(primary=True)
number = fields.IntegerField()
rating = fields.FloatField(default=0.0)
injured = fields.BooleanField(default=False)

Team.set_storage(storage.PickleStorage('team'))
Manager.set_storage(storage.PickleStorage('manager'))
Player.set_storage(storage.PickleStorage('player'))

if debug:
d = Player(name="Griffin", number=10, rating=85.0, injured=True)
Expand Down
11 changes: 11 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Flask==0.10.1
Jinja2==2.7.1
Mako==0.9.0
MarkupSafe==0.18
Werkzeug==0.9.4
itsdangerous==0.23
-e git://github.com/CenterForOpenScience/modular-odm.git@733e11d61311039d90d2c7569cdc16eb2bcaf5b1#egg=modular_odm-origin/develop
pymongo==2.6
python-dateutil==2.1
six==1.3.0
wsgiref==0.1.2
197 changes: 119 additions & 78 deletions templates/edit.mako
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
<%
from main import value_or_pk
%>

<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/static/css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="/static/css/bootstrap-glyphicons.css" rel="stylesheet" media="screen">
Expand All @@ -6,87 +10,124 @@
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>

<form name="edit" method="POST" action="" id="edit">
<legend>${schema_name}</legend>
% for key, value in schema_obj_data.iteritems():
% if key!='_backrefs':
<h4 style="margin-left: 5px;">${key}</h4><div class="form-group row" style="margin-left: 25px;">
% endif
% if key==schema_primary_name:
<ul class="list-group col-lg-4" id="${key}">
<li class="list-group-item form-control data" id="${key}" item="item" contenteditable>${value}</li>
</ul></div>
% elif type(value) is dict and 'foreign' in value:
<ul class="list-group col-lg-4 ForeignField" id="${key}">
<div style="position: relative;">
<li class="list-group-item form-control data" id="${key}" item="item" ondblclick="areYouSure(this)">${value['primary_value']}</li>
<a href="/${value['schema_name']}/${value['primary_value']}/edit" style="position:absolute; top:9; right:9;" class="badge" data-toggle="popover" id="${value['primary_value']}" object-vals='${value['foreign_obj']}'><span class="glyphicon glyphicon-search"></span></a></div>
</ul>
</div>
% elif type(value) is list:
% if type(value[0]) is dict and 'foreign' in value[0]:
<ul class="list-group col-lg-4 ForeignListField sortable" keyName="${key}">
% for item in value:
<div style="position:relative;" >
<li class="list-group-item form-control" item="item" onclick="areYouSure(this)" contenteditable>${item['primary_value']}</li>
<a class="badge glyphicon glyphicon-remove" style="position:absolute; top:9; right:38;" onclick="removeListItem(this)"> </a>
<a href="/${item['schema_name']}/${item['primary_value']}/edit" style="position:absolute; top:9; right:9;" class="badge" data-toggle="popover" id="${item['primary_value']}" object-vals='${item['foreign_obj']}'>
<span class="glyphicon glyphicon-search"></span></a><span class="handle glyphicon glyphicon-move" style="position:absolute; top:9; left:-15;"></span>
</div>
% endfor
<div class="placeholder" style="position: relative;"><li class="placeholder list-group-item form-control" id="${key}placeholder" onclick="$(this).text('');" onkeydown="addListItem($(this).text(), this)" contenteditable>add new...</li>
<a class="badge glyphicon glyphicon-plus" style="position:absolute; top:9; right:9;" onclick="addListItem($(this.parentNode).text(), this);"> </a>
</div>
</ul>
<input type="text" id="${key}" style="display: none;" class="dataList">
</div>
% else:
<ul class="list-group ListField col-lg-4 sortable test1" keyName="${key}">
% for item in value:
<div style="position: relative;"><li item="item" class="list-group-item form-control" contenteditable>${item}</li>
<a class="badge glyphicon glyphicon-remove" style="position:absolute; top:9; right:9;" onclick="removeListItem(this)"> </a><span class="handle glyphicon glyphicon-move" style="position:absolute; top:9; left:-15;"></span>
</div>
% endfor
<input type="text" id="${key}" style="display: none;" value="${value}" class="dataList">
<div class="placeholder" style="position: relative;"><li class="placeholder list-group-item form-control" id="${key}placeholder" onclick="$(this).text('');" onkeydown="addListItem($(this).text(), this)" contenteditable>add new...</li>
<a class="badge glyphicon glyphicon-plus" style="position:absolute; top:9; right:9;" onclick="addListItem($(this.parentNode).text(), this);"> </a>
</div>
</ul>
</div>
%endif
% elif key=='_backrefs':
<h4 style="margin-left: 5px;">references</h4>
% for refs, vals in value.iteritems():
% for schema, schema_attr in vals.iteritems():
% for parent_field_name, parent_keys in schema_attr.iteritems():
<div class="row" style="margin-left: 25px;">
<ul class="list-group col-lg-4">
<h5>${refs}</h5>
% for parent_key in parent_keys:
<div style="position: relative;">
<li class="list-group-item form-control">${parent_key}</li>
<a href="/${schema}/${parent_key}/edit" style="position:absolute; top:9; right:9;" class="badge" data-toggle="popover" id="${parent_key}" object-vals='${parent_key}'>
<span class="glyphicon glyphicon-search"></span></a>
</div>
## <a class="badge glyphicon glyhref="/${schema}/${parent_key}/edit">${parent_key}</a>
% endfor
</ul>
</div>
% endfor
% endfor
% endfor
## <textarea class="data col-lg-4" value="${value}">${value}</textarea></div>
% elif key=='body' or type(value) is dict:
<textarea class="data col-lg-4" value="${value}">${value}</textarea></div>
% else:
<ul class="list-group col-lg-4" id="${key}">
<li class="list-group-item form-control data" id="${key}" item="item" contenteditable>${value}</li>
</ul></div>

<legend>${schema_obj._name}</legend>

% for field_name, field_object in schema_obj._fields.iteritems():

<%
value = getattr(schema_obj, field_name)
%>


% if field_name != "_backrefs":
<h4 style="margin-left: 5px;">${field_name}</h4><div class="form-group row" style="margin-left: 25px;">
## <span>${field_name}</span><br>

<span>

% if field_object._list:
<ul class="list-group col-lg-4 sortable" id="${field_object.__class__.__name__}" keyName="${field_name}">
% for item in value:
## <input type="text" id="${field_object.__class__.__name__}" value="${value_or_pk(item)}" />
<li item="item" class="list-group-item form-control" contenteditable>${value_or_pk(item)}</li>
% endfor
</ul>
% else:
<input type="text" id="${field_object.__class__.__name__}" value="${value_or_pk(value)}" />
% endif
</span>

</div>
% endif

% endfor
<button type="submit"> submit me </button><P>${message}</P>
<input type="text" id="submitter" style="display: none;" name="json_data">
</form>
<br>

##<form name="edit" method="POST" action="" id="edit">
## <legend>${schema_name}</legend>
## % for key, value in schema_obj_data.iteritems():
## % if key!='_backrefs':
## <h4 style="margin-left: 5px;">${key}</h4><div class="form-group row" style="margin-left: 25px;">
## % endif
## % if key==schema_primary_name:
## <ul class="list-group col-lg-4" id="${key}">
## <li class="list-group-item form-control data" id="${key}" item="item" contenteditable>${value}</li>
## </ul></div>
## % elif type(value) is dict and 'foreign' in value:
## <ul class="list-group col-lg-4 ForeignField" id="${key}">
## <div style="position: relative;">
## <li class="list-group-item form-control data" id="${key}" item="item" ondblclick="areYouSure(this)">${value['primary_value']}</li>
## <a href="/${value['schema_name']}/${value['primary_value']}/edit" style="position:absolute; top:9; right:9;" class="badge" data-toggle="popover" id="${value['primary_value']}" object-vals='${value['foreign_obj']}'><span class="glyphicon glyphicon-search"></span></a></div>
## </ul>
## </div>
## % elif isinstance(value, list):
## % if type(value[0]) is dict and 'foreign' in value[0]:
## <ul class="list-group col-lg-4 ForeignListField sortable" keyName="${key}">
## % for item in value:
## <div style="position:relative;" >
## <li class="list-group-item form-control" item="item" onclick="areYouSure(this)" contenteditable>${item['primary_value']}</li>
## <a class="badge glyphicon glyphicon-remove" style="position:absolute; top:9; right:38;" onclick="removeListItem(this)"> </a>
## <a href="/${item['schema_name']}/${item['primary_value']}/edit" style="position:absolute; top:9; right:9;" class="badge" data-toggle="popover" id="${item['primary_value']}" object-vals='${item['foreign_obj']}'>
## <span class="glyphicon glyphicon-search"></span></a><span class="handle glyphicon glyphicon-move" style="position:absolute; top:9; left:-15;"></span>
## </div>
## % endfor
## <div class="placeholder" style="position: relative;"><li class="placeholder list-group-item form-control" id="${key}placeholder" onclick="$(this).text('');" onkeydown="addListItem($(this).text(), this)" contenteditable>add new...</li>
## <a class="badge glyphicon glyphicon-plus" style="position:absolute; top:9; right:9;" onclick="addListItem($(this.parentNode).text(), this);"> </a>
## </div>
## </ul>
## <input type="text" id="${key}" style="display: none;" class="dataList">
## </div>
## % else:
## <ul class="list-group ListField col-lg-4 sortable test1" keyName="${key}">
## % for item in value:
## <div style="position: relative;"><li item="item" class="list-group-item form-control" contenteditable>${item}</li>
## <a class="badge glyphicon glyphicon-remove" style="position:absolute; top:9; right:9;" onclick="removeListItem(this)"> </a><span class="handle glyphicon glyphicon-move" style="position:absolute; top:9; left:-15;"></span>
## </div>
## % endfor
## <input type="text" id="${key}" style="display: none;" value="${value}" class="dataList">
## <div class="placeholder" style="position: relative;"><li class="placeholder list-group-item form-control" id="${key}placeholder" onclick="$(this).text('');" onkeydown="addListItem($(this).text(), this)" contenteditable>add new...</li>
## <a class="badge glyphicon glyphicon-plus" style="position:absolute; top:9; right:9;" onclick="addListItem($(this.parentNode).text(), this);"> </a>
## </div>
## </ul>
## </div>
## %endif
## % elif key=='_backrefs':
## <h4 style="margin-left: 5px;">references</h4>
## % for refs, vals in value.iteritems():
## % for schema, schema_attr in vals.iteritems():
## % for parent_field_name, parent_keys in schema_attr.iteritems():
## <div class="row" style="margin-left: 25px;">
## <ul class="list-group col-lg-4">
## <h5>${refs}</h5>
## % for parent_key in parent_keys:
## <div style="position: relative;">
## <li class="list-group-item form-control">${parent_key}</li>
## <a href="/${schema}/${parent_key}/edit" style="position:absolute; top:9; right:9;" class="badge" data-toggle="popover" id="${parent_key}" object-vals='${parent_key}'>
## <span class="glyphicon glyphicon-search"></span></a>
## </div>
#### <a class="badge glyphicon glyhref="/${schema}/${parent_key}/edit">${parent_key}</a>
## % endfor
## </ul>
## </div>
## % endfor
## % endfor
## % endfor
#### <textarea class="data col-lg-4" value="${value}">${value}</textarea></div>
## % elif key=='body' or type(value) is dict:
## <textarea class="data col-lg-4" value="${value}">${value}</textarea></div>
## % else:
## <ul class="list-group col-lg-4" id="${key}">
## <li class="list-group-item form-control data" id="${key}" item="item" contenteditable>${value}</li>
## </ul></div>
## % endif
## % endfor
## <button type="submit"> submit me </button><P>${message}</P>
## <input type="text" id="submitter" style="display: none;" name="json_data">
##</form>
##<br>
<a href="/${schema_name}"><-${schema_name}</a>

<script>
Expand All @@ -100,7 +141,7 @@
});
$('form').submit(function(){

var search = $('.ListField');
var search = $('#ListField');
for(var i=0; i<search.length; i++){
var hasher = "#" + $(search[i]).attr('keyName');
var newList = $(search[i])
Expand All @@ -112,7 +153,7 @@
$(hasher).attr('value', newList);
}

var search = $('.ForeignListField');
var search = $('#ForeignListField');
for(var i=0; i<search.length; i++){
var hasher = "#" + $(search[i]).attr('keyName');
var newList = $(search[i])
Expand Down
3 changes: 1 addition & 2 deletions templates/index.mako
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@
<p class="prettyprint">
% for key, value in schemas.iteritems():
<a href="/${key}">${key}</a> ... ${type(value._storage[0]).__name__}</p>
% endfor
## ${schemas}</p>
% endfor