diff --git a/README.txt b/README.txt index b8629f7..2feaa8b 100755 --- a/README.txt +++ b/README.txt @@ -650,9 +650,11 @@ created object: >>> from loops import util >>> topicUid = util.getUidForObject(topic) + >>> predicateUid = util.getUidForObject(concepts.getDefaultPredicate()) >>> request = TestRequest(form={'form.title': u'Test Note', ... 'form.type': u'.loops/concepts/note', - ... 'form.concept.search.text_selected': str(topicUid)}) + ... 'form.assignments.selected': + ... [':'.join((topicUid, predicateUid))]}) >>> view = NodeView(m112, request) >>> cont = CreateObject(view, request) >>> cont.update() diff --git a/browser/concept.py b/browser/concept.py index cb6aa5b..2a7c809 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -268,6 +268,11 @@ class ConceptRelationView(BaseView): return ':'.join((self.loopsRoot.getLoopsUri(self.context), self.loopsRoot.getLoopsUri(self.predicate))) + @Lazy + def uidToken(self): + return ':'.join((util.getUidForObject(self.context), + util.getUidForObject(self.predicate))) + @Lazy def isProtected(self): return zapi.getName(self.predicate) == 'hasType' diff --git a/browser/form.py b/browser/form.py index d60f077..1909696 100644 --- a/browser/form.py +++ b/browser/form.py @@ -46,6 +46,8 @@ from loops import util from loops.util import _ +# forms + class ObjectForm(NodeView): template = ViewPageTemplateFile('form_macros.pt') @@ -61,32 +63,10 @@ class ObjectForm(NodeView): def __call__(self): return innerHtml(self) - -class CreateObjectForm(ObjectForm, Form): - - @property - def macro(self): return self.template.macros['create'] - - title = _(u'Create Resource, Type = ') - form_action = 'create_resource' - dialog_name = 'create' - - @property - def form_fields(self): - typeToken = self.request.get('form.type') - if typeToken: - t = self.loopsRoot.loopsTraverse(typeToken) - ifc = ITypeConcept(t).typeInterface - else: - ifc = INote - self.typeInterface = ifc - return FormFields(ifc) - - -class InnerForm(CreateObjectForm): - - @property - def macro(self): return self.template.macros['fields'] + @Lazy + def defaultPredicate(self): + return util.getUidForObject( + self.loopsRoot.getConceptManager().getDefaultPredicate()) class EditObjectForm(ObjectForm, EditForm): @@ -109,22 +89,103 @@ class EditObjectForm(ObjectForm, EditForm): @property def assignments(self): for c in self.context.getConceptRelations(): - yield ConceptRelationView(c, self.request) + r = ConceptRelationView(c, self.request) + if r.isProtected: continue + yield r def __init__(self, context, request): super(EditObjectForm, self).__init__(context, request) self.context = self.virtualTargetObject -class CreateObject(FormController): +class CreateObjectForm(ObjectForm, Form): + + @property + def macro(self): return self.template.macros['create'] + + title = _(u'Create Resource, Type = ') + form_action = 'create_resource' + dialog_name = 'create' + + @property + def form_fields(self): + typeToken = self.request.get('form.type') + if typeToken: + t = self.loopsRoot.loopsTraverse(typeToken) + ifc = ITypeConcept(t).typeInterface + else: + ifc = INote + self.typeInterface = ifc + return FormFields(ifc) + + @property + def assignments(self): + return () + + +class InnerForm(CreateObjectForm): + + @property + def macro(self): return self.template.macros['fields'] + + +# processing form input + +class EditObject(FormController): + + prefix = 'form.' + conceptPrefix = 'assignments.' + + def update(self): + self.updateFields(self.view.virtualTargetObject) + return True @Lazy def loopsRoot(self): return self.view.loopsRoot + def updateFields(self, obj): + form = self.request.form + adapter = IType(obj).typeInterface(obj) + for k in form.keys(): + if k.startswith(self.prefix): + fn = k[len(self.prefix):] + if fn in ('action', 'type',) or fn.endswith('-empty-marker'): + continue + value = form[k] + if fn.startswith(self.conceptPrefix) and value: + self.assignConcepts(obj, fn[len(self.conceptPrefix):], value) + else: + setattr(adapter, fn, value) + notify(ObjectModifiedEvent(obj)) + + def assignConcepts(self, obj, fieldName, value): + old = [] + selected = [] + for v in value: + if fieldName == 'old': + old.append(v) + elif fieldName == 'selected': + selected.append(v) + for v in old: + if v not in selected: + c, p = v.split(':') + concept = util.getObjectForUid(c) + predicate = util.getObjectForUid(p) + obj.deassignConcept(concept, [predicate]) + for v in selected: + if v not in old: + c, p = v.split(':') + concept = util.getObjectForUid(c) + predicate = util.getObjectForUid(p) + exists = obj.getConceptRelations(predicates=[p], concept=concept) + if not exists: + obj.assignConcept(concept, predicate) + + +class CreateObject(EditObject): + def update(self): - prefix = 'form.' - conceptPrefix = 'concept.' form = self.request.form obj = Resource() container = self.loopsRoot.getResourceManager() @@ -135,26 +196,10 @@ class CreateObject(FormController): container[name] = obj tc = form.get('form.type') or '.loops/concepts/note' obj.resourceType = self.loopsRoot.loopsTraverse(tc) - adapter = IType(obj).typeInterface(obj) - for k in form.keys(): - if k.startswith(prefix): - fn = k[len(prefix):] - if fn in ('action', 'type',) or fn.endswith('-empty-marker'): - continue - value = form[k] - if fn.startswith(conceptPrefix): - self.assignConcepts(obj, fn[len(conceptPrefix):], value) - else: - setattr(adapter, fn, value) notify(ObjectCreatedEvent(obj)) - notify(ObjectModifiedEvent(obj)) + self.updateFields(obj) return True - def assignConcepts(self, obj, fieldName, value): - if value and fieldName == 'search.text_selected': - concept = util.getObjectForUid(value) - obj.assignConcept(concept) - class ResourceNameChooser(NameChooser): @@ -165,35 +210,3 @@ class ResourceNameChooser(NameChooser): name = super(ResourceNameChooser, self).chooseName(name, obj) return name - -class EditObject(FormController): - - @Lazy - def loopsRoot(self): - return self.view.loopsRoot - - def update(self): - prefix = 'form.' - conceptPrefix = 'concept.' - form = self.request.form - obj = self.view.virtualTargetObject - adapter = IType(obj).typeInterface(obj) - for k in form.keys(): - if k.startswith(prefix): - fn = k[len(prefix):] - if fn in ('action', 'type',) or fn.endswith('-empty-marker'): - continue - value = form[k] - if fn.startswith(conceptPrefix): - self.assignConcepts(obj, fn[len(conceptPrefix):], value) - else: - setattr(adapter, fn, value) - notify(ObjectModifiedEvent(obj)) - return True - - def assignConcepts(self, obj, fieldName, value): - if value and fieldName == 'search.text_selected': - concept = util.getObjectForUid(value) - obj.assignConcept(concept) - - diff --git a/browser/form_macros.pt b/browser/form_macros.pt index 65aa458..d586635 100644 --- a/browser/form_macros.pt +++ b/browser/form_macros.pt @@ -68,6 +68,7 @@ Assign Concept(s) + @@ -106,9 +107,10 @@ - - + + Something (Topic) @@ -118,12 +120,12 @@ - + -    - + + diff --git a/browser/loops.js b/browser/loops.js index 4161b58..2bb4e9d 100644 --- a/browser/loops.js +++ b/browser/loops.js @@ -79,12 +79,17 @@ function objectDialog(dlgName, url) { function addConceptAssignment() { node = dojo.byId('form.assignments'); - token = document.getElementsByName('form.concept.search.text_selected')[0].value; - if (token.length == 0) {return false;} - title = document.getElementsByName('form.concept.search.text')[0].value; + cToken = document.getElementsByName('concept.search.text_selected')[0].value; + if (cToken.length == 0) { + alert('Please select a concept!'); + return false; + } + pToken = dojo.byId('concept.search.predicate').value; + token = cToken + ':' + pToken; + title = document.getElementsByName('concept.search.text')[0].value; var td = document.createElement('td'); td.setAttribute('colspan', '5'); - td.innerHTML = '' + title + ''; + td.innerHTML = '' + title + ''; var tr = document.createElement('tr'); tr.appendChild(td); node.appendChild(tr); diff --git a/util.py b/util.py index 8b9dcfe..d28790b 100644 --- a/util.py +++ b/util.py @@ -66,4 +66,4 @@ def getUidForObject(obj): if obj == '*': # wild card return '*' intIds = component.getUtility(IIntIds) - return intIds.queryId(obj) + return str(intIds.queryId(obj))