web/formfields.py
changeset 7875 65e460690139
parent 7756 98e34ae4cf89
child 7894 ad0eeb0f7a8d
--- a/web/formfields.py	Mon Sep 26 19:46:04 2011 +0200
+++ b/web/formfields.py	Tue Sep 27 18:46:36 2011 +0200
@@ -1018,59 +1018,6 @@
         return list(self.fields)
 
 
-# relation vocabulary helper functions #########################################
-
-def relvoc_linkedto(entity, rtype, role):
-    # first see if its specified by __linkto form parameters
-    linkedto = entity.linked_to(rtype, role)
-    if linkedto:
-        buildent = entity._cw.entity_from_eid
-        return [(buildent(eid).view('combobox'), unicode(eid)) for eid in linkedto]
-    return []
-
-def relvoc_init(entity, rtype, role, required=False):
-    # it isn't, check if the entity provides a method to get correct values
-    vocab = []
-    if not required:
-        vocab.append(('', INTERNAL_FIELD_VALUE))
-    # vocabulary doesn't include current values, add them
-    if entity.has_eid():
-        rset = entity.related(rtype, role)
-        vocab += [(e.view('combobox'), unicode(e.eid)) for e in rset.entities()]
-    return vocab
-
-def relvoc_unrelated(entity, rtype, role, limit=None):
-    if isinstance(rtype, basestring):
-        rtype = entity._cw.vreg.schema.rschema(rtype)
-    if entity.has_eid():
-        done = set(row[0] for row in entity.related(rtype, role))
-    else:
-        done = None
-    result = []
-    rsetsize = None
-    for objtype in rtype.targets(entity.e_schema, role):
-        if limit is not None:
-            rsetsize = limit - len(result)
-        result += _relvoc_unrelated(entity, rtype, objtype, role, rsetsize, done)
-        if limit is not None and len(result) >= limit:
-            break
-    return result
-
-def _relvoc_unrelated(entity, rtype, targettype, role, limit, done):
-    """return unrelated entities for a given relation and target entity type
-    for use in vocabulary
-    """
-    if done is None:
-        done = set()
-    res = []
-    for entity in entity.unrelated(rtype, targettype, role, limit).entities():
-        if entity.eid in done:
-            continue
-        done.add(entity.eid)
-        res.append((entity.view('combobox'), unicode(entity.eid)))
-    return res
-
-
 class RelationField(Field):
     """Use this field to edit a relation of an entity.
 
@@ -1095,10 +1042,10 @@
         entity = form.edited_entity
         # first see if its specified by __linkto form parameters
         if limit is None:
-            linkedto = relvoc_linkedto(entity, self.name, self.role)
+            linkedto = self.relvoc_linkedto(form)
             if linkedto:
                 return linkedto
-            vocab = relvoc_init(entity, self.name, self.role, self.required)
+            vocab = self.relvoc_init(form)
         else:
             vocab = []
         # it isn't, check if the entity provides a method to get correct values
@@ -1108,22 +1055,63 @@
             warn('[3.6] found %s on %s, should override field.choices instead (need tweaks)'
                  % (method, form), DeprecationWarning)
         except AttributeError:
-            vocab += relvoc_unrelated(entity, self.name, self.role, limit)
+            vocab += self.relvoc_unrelated(form, limit)
         if self.sort:
             vocab = vocab_sort(vocab)
         return vocab
 
-    def form_init(self, form):
-        #if not self.display_value(form):
-        value = form.edited_entity.linked_to(self.name, self.role)
-        if value:
-            searchedvalues = ['%s:%s:%s' % (self.name, eid, self.role)
-                              for eid in value]
-            # remove associated __linkto hidden fields
-            for field in form.root_form.fields_by_name('__linkto'):
-                if field.value in searchedvalues:
-                    form.root_form.remove_field(field)
-            form.formvalues[(self, form)] = value
+    def relvoc_linkedto(self, form):
+        linkedto = form.linked_to.get((self.name, self.role))
+        if linkedto:
+            buildent = form._cw.entity_from_eid
+            return [(buildent(eid).view('combobox'), unicode(eid))
+                    for eid in linkedto]
+        return []
+
+    def relvoc_init(self, form):
+        entity, rtype, role = form.edited_entity, self.name, self.role
+        vocab = []
+        if not self.required:
+            vocab.append(('', INTERNAL_FIELD_VALUE))
+        # vocabulary doesn't include current values, add them
+        if form.edited_entity.has_eid():
+            rset = form.edited_entity.related(self.name, self.role)
+            vocab += [(e.view('combobox'), unicode(e.eid))
+                      for e in rset.entities()]
+        return vocab
+
+    def relvoc_unrelated(self, form, limit=None):
+        entity = form.edited_entity
+        rtype = entity._cw.vreg.schema.rschema(self.name)
+        if entity.has_eid():
+            done = set(row[0] for row in entity.related(rtype, self.role))
+        else:
+            done = None
+        result = []
+        rsetsize = None
+        for objtype in rtype.targets(entity.e_schema, self.role):
+            if limit is not None:
+                rsetsize = limit - len(result)
+            result += self._relvoc_unrelated(form, objtype, rsetsize, done)
+            if limit is not None and len(result) >= limit:
+                break
+        return result
+
+    def _relvoc_unrelated(self, form, targettype, limit, done):
+        """return unrelated entities for a given relation and target entity type
+        for use in vocabulary
+        """
+        if done is None:
+            done = set()
+        res = []
+        entity = form.edited_entity
+        for entity in entity.unrelated(self.name, targettype,
+                                       self.role, limit).entities():
+            if entity.eid in done:
+                continue
+            done.add(entity.eid)
+            res.append((entity.view('combobox'), unicode(entity.eid)))
+        return res
 
     def format_single_value(self, req, value):
         return unicode(value)