devtools/cwtwill.py
changeset 0 b97547f5f1fa
child 1802 d628defebc17
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devtools/cwtwill.py	Wed Nov 05 15:52:50 2008 +0100
@@ -0,0 +1,108 @@
+"""cubicweb extensions for twill"""
+
+import re
+from urllib import quote
+
+from twill import commands as twc
+
+# convenience / consistency renaming
+has_text = twc.find
+hasnt_text = twc.notfind
+
+
+# specific commands
+_LINK = re.compile('<a.*?href="(.*?)".*?>(.*?)</a>', re.I | re.S)
+
+def has_link(text, url=''):
+    browser = twc.get_browser()
+    html = browser.get_html()
+    if html:
+        for match in _LINK.finditer(html):
+            linkurl = match.group(1)
+            linktext = match.group(2)
+            if linktext == text:
+                # if url is specified linkurl must match
+                if url and linkurl != url:
+                    continue
+                return        
+    raise AssertionError('link %s (%s) not found' % (text, url))
+        
+
+def view(rql, vid=''):
+    """
+    >> view 'Project P'
+
+    apply <vid> to <rql>'s rset
+    """
+    if vid:
+        twc.go('view?rql=%s&vid=%s' % (quote(rql), vid))
+    else:
+        twc.go('view?rql=%s' % quote(rql))
+
+def create(etype):
+    """
+    >> create Project
+
+    go to <etype>'s creation page
+    """
+    twc.go('view?etype=%s&vid=creation' % etype)
+
+def edit(rql):
+    """
+    >> edit "Project P WHERE P eid 123"
+
+    calls edition view for <rql>
+    """
+    twc.go('view?rql=%s&vid=edition' % quote(rql))
+
+
+        
+
+def setvalue(formname, fieldname, value):
+    """
+    >> setvalue entityForm name pylint
+
+    sets the field's value in the form
+    <forname> should either be the form's index, the form's name
+    or the form's id
+    """
+    browser = twc.get_browser()
+    form = browser.get_form(formname)
+    if form is None:
+        # try to find if one of the forms has <formname> as id
+        for index, form in enumerate(browser._browser.forms()):
+            # forms in cubicweb don't always have a name
+            if form.attrs.get('id') == formname:
+                # browser.get_form_field knows how to deal with form index
+                formname = str(index+1)
+                break
+        else:
+            raise ValueError('could not find form named <%s>' % formname)
+    eid = browser.get_form_field(form, 'eid').value
+    twc.formvalue(formname, '%s:%s' % (fieldname, eid), value)
+
+
+def submitform(formname, submit_button=None):
+    """
+    >> submitform entityForm
+
+    Submit the form named entityForm. This is useful when the form is pre-filed
+    and we only want to click on submit.
+    (The original submit command chooses the form to submit according to the last
+    formvalue instruction)
+    """
+    browser = twc.get_browser()
+    form = browser.get_form(formname)
+    if form is None:
+        # try to find if one of the forms has <formname> as id
+        for form in browser._browser.forms():
+            # forms in cubicweb don't always have a name
+            if form.attrs.get('id') == formname:
+                break
+        else:
+            raise ValueError('could not find form named <%s>' % formname)
+    browser._browser.form = form
+    browser.submit(submit_button)
+
+    
+# missing actions: delete, copy, changeview