Ignore:
Timestamp:
13 Nov 2014, 16:03:08 (10 years ago)
Author:
Henrik Bettermann
Message:

More renaming: University -> Institution, Student -> Customer
Change portal title.

Location:
main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser
Files:
16 edited
3 moved

Legend:

Unmodified
Added
Removed
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/batchprocessing.txt

    r11949 r11952  
    2121Create a site:
    2222
    23     >>> from waeup.ikoba.app import University
    24     >>> getRootFolder()['app'] = University()
     23    >>> from waeup.ikoba.app import Institution
     24    >>> getRootFolder()['app'] = Institution()
    2525    >>> from zope.component.hooks import setSite
    2626    >>> setSite(getRootFolder()['app'])
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/breadcrumbs.py

    r11949 r11952  
    2828from waeup.ikoba.browser.interfaces import (
    2929    IBreadcrumb, IBreadcrumbIgnorable, IBreadcrumbContainer, IIkobaObject,
    30     IUniversity, IUsersContainer, IDataCenter,
     30    IInstitution, IUsersContainer, IDataCenter,
    3131    )
    3232from waeup.ikoba.reports import IReportsContainer
     
    8686        return self.viewname
    8787
    88 class UniversityBreadcrumb(Breadcrumb):
    89     """A breadcrumb for university index pages.
    90     """
    91     grok.context(IUniversity)
     88class InstitutionBreadcrumb(Breadcrumb):
     89    """A breadcrumb for institution index pages.
     90    """
     91    grok.context(IInstitution)
    9292    title = _(u'Home')
    9393    parent = None
     
    9797
    9898    Here we need a special `parent()` implementation, because the
    99     parent object is not a real parent (the University object has no
     99    parent object is not a real parent (the Institution object has no
    100100    valid parent in terms of breadcrumbs). Instead it is the
    101101    ``administration`` view of the same context the ``manage`` page
    102102    itself is bound to.
    103103    """
    104     grok.context(IUniversity)
     104    grok.context(IInstitution)
    105105    grok.name('manage')
    106106    title = _(u'Portal Settings')
     
    113113
    114114class AdministrationBreadcrumb(Breadcrumb):
    115     """A breadcrumb for administration areas of University instances.
    116     """
    117     grok.context(IUniversity)
     115    """A breadcrumb for administration areas of Institution instances.
     116    """
     117    grok.context(IInstitution)
    118118    grok.name('administration')
    119119    title = _(u'Administration')
     
    158158    title = _(u'Reports')
    159159    parent_viewname = 'administration'
    160     target = None
    161 
    162 class ExportsBreadcrumb(Breadcrumb):
    163     """A breadcrumb for exports.
    164     """
    165     grok.context(IExportJobContainer)
    166     title = _(u'Student Data Exports')
    167160    target = None
    168161
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/breadcrumbs.txt

    r11949 r11952  
    99===============================
    1010
    11 We create a university to check the breadcrumb functionality.
    12 
    13     >>> from waeup.ikoba.app import University
     11We create a institution to check the breadcrumb functionality.
     12
     13    >>> from waeup.ikoba.app import Institution
    1414    >>> root = getRootFolder()
    15     >>> root['app'] = University()
     15    >>> root['app'] = Institution()
    1616    >>> app = root['app']
    1717
     
    2525    >>> blist1 = getBreadcrumbList(app, 'index')
    2626    >>> blist1
    27     [<waeup.ikoba.browser.breadcrumbs.UniversityBreadcrumb object at 0x...>]
     27    [<waeup.ikoba.browser.breadcrumbs.InstitutionBreadcrumb object at 0x...>]
    2828
    2929A slightly more extensive list for the datacenter:
     
    3232    >>> from pprint import pprint
    3333    >>> pprint(blist2)
    34     [<waeup.ikoba.browser.breadcrumbs.UniversityBreadcrumb object at 0x...>,
     34    [<waeup.ikoba.browser.breadcrumbs.InstitutionBreadcrumb object at 0x...>,
    3535     <waeup.ikoba.browser.breadcrumbs.AdministrationBreadcrumb object at 0x...>,
    3636     <waeup.ikoba.browser.breadcrumbs.DataCenterBreadcrumb object at 0x...>]
    3737
    38 We get a breadcrumb for university, administration area and data
     38We get a breadcrumb for institution, administration area and data
    3939center in that order.
    4040
     
    4747
    4848     >>> pprint([(x.context, x.viewname) for x in blist2])
    49      [(<waeup.ikoba.app.University object at 0x...>, 'index'),
    50       (<waeup.ikoba.app.University object at 0x...>, 'administration'),
     49     [(<waeup.ikoba.app.Institution object at 0x...>, 'index'),
     50      (<waeup.ikoba.app.Institution object at 0x...>, 'administration'),
    5151      (<waeup.ikoba.datacenter.DataCenter object at 0x...>, 'index')]
    5252
    5353The administration area breadcrumb might be a surprise, as there is no
    5454equivalent object in the ZODB. In fact the administration area is only
    55 a certain view (the 'administration' view) on the university object.
     55a certain view (the 'administration' view) on the institution object.
    5656
    5757We will show below, how you can define breadcrumbs this way.
     
    6262
    6363This way we can make sure, that there are different breadcrumb lists
    64 generated for instance for the administration view of University
     64generated for instance for the administration view of Institution
    6565instances and the index view. While the first should look something
    6666like::
     
    118118
    119119    >>> pprint(mybccontainer.getList())
    120     [<...breadcrumbs.UniversityBreadcrumb object at 0x...>,
     120    [<...breadcrumbs.InstitutionBreadcrumb object at 0x...>,
    121121     <...breadcrumbs.AdministrationBreadcrumb object at 0x...>,
    122122     <...breadcrumbs.UsersContainerBreadcrumb object at 0x...>]
     
    128128
    129129Now we can get breadcrumbs for contexts and view names. For example a
    130 breadcrumb for the 'index' view of our University object:
     130breadcrumb for the 'index' view of our Institution object:
    131131
    132132    >>> from zope.component import getAdapter
     
    134134    >>> b1 = getAdapter(app, IBreadcrumb, 'index')
    135135    >>> b1
    136     <waeup.ikoba.browser.breadcrumbs.UniversityBreadcrumb object at 0x...>
     136    <waeup.ikoba.browser.breadcrumbs.InstitutionBreadcrumb object at 0x...>
    137137
    138138Breadcrumb objects provide a title:
     
    168168
    169169    >>> b2.parent
    170     (<waeup.ikoba.app.University object at 0x...>, 'administration')
    171 
    172 This result denotes a new context object (the University instance we
     170    (<waeup.ikoba.app.Institution object at 0x...>, 'administration')
     171
     172This result denotes a new context object (the Institution instance we
    173173created above) and a view name ('administration').
    174174
     
    188188As you can see, we get an AdministrationBreadcrumb, although the
    189189context object, for which the breadcrumb was created is also the
    190 University instance as above:
     190Institution instance as above:
    191191
    192192    >>> b3.context is b1.context
     
    197197    >>> context, viewname = b3.parent
    198198    >>> context, viewname
    199     (<waeup.ikoba.app.University object at 0x...>, 'index')
     199    (<waeup.ikoba.app.Institution object at 0x...>, 'index')
    200200
    201201We create last breadcrumb:
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/browser.txt

    r11949 r11952  
    44Here we visit all parts of a Ikoba portal using a browser.
    55
    6 University
     6Institution
    77==========
    88
    99We can watch universities in the browser.
    1010
    11 We create an university object and put into the ZODB root::
     11We create an institution object and put into the ZODB root::
    1212
    1313  >>> root = getRootFolder()
     
    1515  []
    1616
    17   >>> from waeup.ikoba.app import University
    18   >>> u = University()
    19   >>> root['myuniversity'] = u
     17  >>> from waeup.ikoba.app import Institution
     18  >>> u = Institution()
     19  >>> root['myinstitution'] = u
    2020  >>> list(root)
    21   [u'myuniversity']
     21  [u'myinstitution']
    2222
    2323  >>> from zope.component.hooks import setSite
    24   >>> setSite(root['myuniversity'])
     24  >>> setSite(root['myinstitution'])
    2525
    2626To make sure, we can 'watch' pages, we first have to initialize out
     
    3030  >>> browser = Browser()
    3131
    32 Let's get the default view of a university::
    33 
    34   >>> browser.open('http://localhost/myuniversity')
     32Let's get the default view of a institution::
     33
     34  >>> browser.open('http://localhost/myinstitution')
    3535  >>> print browser.contents
    3636  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
     
    5555The contact form for anonymous users is called 'Enquiries'::
    5656
    57   >>> browser.open('http://localhost/myuniversity')
     57  >>> browser.open('http://localhost/myinstitution')
    5858  >>> browser.getLink('Enquiries').click()
    5959  >>> browser.getControl('Send').click()
     
    7474Registered users with an email address can request a password change:
    7575
    76   >>> root['myuniversity']['users'].addUser('forgetful', 'secret',title='Bob Forgetful',
     76  >>> root['myinstitution']['users'].addUser('forgetful', 'secret',title='Bob Forgetful',
    7777  ...                               description='A forgetful user', email='aa@aa.ng')
    78   >>> browser.open('http://localhost/myuniversity/changepw')
     78  >>> browser.open('http://localhost/myinstitution/changepw')
    7979  >>> browser.getControl(name="form.identifier").value = 'forgetful'
    8080  >>> browser.getControl(name="form.email").value = 'aa@aa.ng'
     
    9191We can then get an edit view of the configuration container::
    9292
    93   >>> browser.open('http://localhost/myuniversity/configuration')
    94   >>> print browser.contents
    95   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
    96   ...<form action="http://localhost/myuniversity/configuration/@@index"
    97   ...
    98 
    99 The edit form contains the default value for the university name::
    100 
    101   >>> 'Sample University' in browser.contents
     93  >>> browser.open('http://localhost/myinstitution/configuration')
     94  >>> print browser.contents
     95  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
     96  ...<form action="http://localhost/myinstitution/configuration/@@index"
     97  ...
     98
     99The edit form contains the default value for the institution name::
     100
     101  >>> 'Sample Institution' in browser.contents
    102102  True
    103103
     
    110110  ...
    111111
    112   >>> browser.open('http://localhost/myuniversity/configuration')
     112  >>> browser.open('http://localhost/myinstitution/configuration')
    113113  >>> browser.getControl("Update plugins").click()
    114114  >>> print browser.contents
     
    120120and is properly rendered on the frontpage of the portal:
    121121
    122   >>> browser.open('http://localhost/myuniversity')
     122  >>> browser.open('http://localhost/myinstitution')
    123123  >>> print browser.contents
    124124  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
     
    134134If we change to German so that the German part of frontpage.rst is rendered:
    135135
    136   >>> browser.open('http://localhost/myuniversity//@@change_language?lang=de')
     136  >>> browser.open('http://localhost/myinstitution//@@change_language?lang=de')
    137137  >>> print browser.contents
    138138  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
     
    147147Switch back to English:
    148148
    149   >>> browser.open('http://localhost/myuniversity//@@change_language?lang=en')
     149  >>> browser.open('http://localhost/myinstitution//@@change_language?lang=en')
    150150
    151151
     
    153153============
    154154
    155   >>> browser.open('http://localhost/myuniversity')
     155  >>> browser.open('http://localhost/myinstitution')
    156156  >>> browser.getLink('Portal Users').click()
    157157  >>> print browser.contents
     
    187187manually by setting the roles attribute:
    188188
    189   >>> print root['myuniversity']['users']['bob'].roles
     189  >>> print root['myinstitution']['users']['bob'].roles
    190190  []
    191   >>> root['myuniversity']['users']['bob'].roles = ['waeup.UsersManager']
    192   >>> print root['myuniversity']['users']['bob'].roles
     191  >>> root['myinstitution']['users']['bob'].roles = ['waeup.UsersManager']
     192  >>> print root['myinstitution']['users']['bob'].roles
    193193  ['waeup.UsersManager']
    194   >>> browser.open('http://localhost/myuniversity/users')
     194  >>> browser.open('http://localhost/myinstitution/users')
    195195  >>> print browser.contents
    196196  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
     
    200200Users can't be added twice:
    201201
    202   >>> browser.open('http://localhost/myuniversity/users/add')
     202  >>> browser.open('http://localhost/myinstitution/users/add')
    203203  >>> browser.getControl(name="form.name").value = 'bob'
    204204  >>> browser.getControl(name="form.title").value = 'Bob The User'
     
    215215Users can be deleted:
    216216
    217   >>> browser.open('http://localhost/myuniversity/users')
     217  >>> browser.open('http://localhost/myinstitution/users')
    218218  >>> browser.getControl("Remove", index=0).click()
    219219  >>> 'User account bob successfully deleted' in browser.contents
     
    227227Let's enter the contact form::
    228228
    229   >>> browser.open('http://localhost/myuniversity/contactadmin')
     229  >>> browser.open('http://localhost/myinstitution/contactadmin')
    230230  >>> print browser.contents
    231231  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"...
     
    236236contact@waeup.org)::
    237237
    238   >>> browser.open('http://localhost/myuniversity/contactadmin')
     238  >>> browser.open('http://localhost/myinstitution/contactadmin')
    239239  >>> browser.getControl(name='form.body').value = "test message"
    240240  >>> browser.getControl('Send').click()
     
    253253The data center helps us uploading files for later import or similar.
    254254
    255   >>> browser.open('http://localhost/myuniversity')
     255  >>> browser.open('http://localhost/myinstitution')
    256256  >>> browser.getLink('Data Center').click()
    257257
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/captcha.py

    r11949 r11952  
    3232    ICaptchaRequest, ICaptchaResponse, ICaptcha, ICaptchaConfig,
    3333    ICaptchaManager)
    34 from waeup.ikoba.interfaces import IUniversity
     34from waeup.ikoba.interfaces import IInstitution
    3535
    3636#
     
    322322    # A test page to see a captcha in action
    323323    grok.name('captcha')
    324     grok.context(IUniversity)
     324    grok.context(IInstitution)
    325325    grok.require('waeup.Public')
    326326    title = 'Captcha Test'
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/exceptions.py

    r11949 r11952  
    6464    """A page rendered when an object cannot be found.
    6565
    66     XXX: This page won't work for objects above a w.k.University.
     66    XXX: This page won't work for objects above a w.k.Institution.
    6767    """
    6868    grok.context(INotFound)
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/interfaces.py

    r11949 r11952  
    2121from zope.interface import Interface, Attribute
    2222from waeup.ikoba.interfaces import (
    23     IIkobaObject, IUniversity, IUsersContainer, IDataCenter, validate_email)
     23    IIkobaObject, IInstitution, IUsersContainer, IDataCenter, validate_email)
    2424from waeup.ikoba.interfaces import MessageFactory as _
    2525
     
    161161
    162162        If no `headerline` is given, a default will be rendered (name
    163         of university).
     163        of institution).
    164164
    165165        If no `title` is given, nothing will be rendered.
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/layout.py

    r11949 r11952  
    220220    #: An instance of the default theme to use for the site layout
    221221    stafftemp = grok.PageTemplateFile('templates/staffsitelayout.pt')
    222     studenttemp = grok.PageTemplateFile('templates/studentsitelayout.pt')
     222    customertemp = grok.PageTemplateFile('templates/customersitelayout.pt')
    223223
    224224    @property
     
    227227
    228228    def getAppTitle(self):
    229         return getattr(grok.getSite()['configuration'], 'name', u'Sample University')
     229        return getattr(grok.getSite()['configuration'], 'name', u'Sample Institution')
    230230
    231231    def getAppAcronym(self):
     
    287287    def render(self):
    288288        if self.isCustomer() or not self.isAuthenticated():
    289             return self.studenttemp.render(self)
     289            return self.customertemp.render(self)
    290290        return self.stafftemp.render(self)
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/pages.py

    r11949 r11952  
    4646    IkobaDisplayFormPage, NullValidator)
    4747from waeup.ikoba.browser.interfaces import (
    48     IUniversity, ICaptchaManager, IChangePassword)
     48    IInstitution, ICaptchaManager, IChangePassword)
    4949from waeup.ikoba.browser.layout import jsaction, action, UtilityView
    5050from waeup.ikoba.interfaces import MessageFactory as _
     
    268268                self.flash(_('You logged in.'))
    269269                if self.request.principal.user_type == 'customer':
    270                     student = grok.getSite()['customerss'][
     270                    customer = grok.getSite()['customers'][
    271271                        self.request.principal.id]
    272272                    rel_link = '/customers/%s' % self.request.principal.id
    273                     if student.personal_data_expired:
     273                    if customer.personal_data_expired:
    274274                        rel_link = '/customerss/%s/edit_personal' % (
    275275                            self.request.principal.id)
     
    325325class ContactAdminForm(IkobaForm):
    326326    grok.name('contactadmin')
    327     #grok.context(IUniversity)
     327    #grok.context(IInstitution)
    328328    grok.template('contactform')
    329329    grok.require('waeup.Authenticated')
     
    405405
    406406#
    407 # University related pages...
     407# Institution related pages...
    408408#
    409409
    410 class UniversityPage(IkobaDisplayFormPage):
    411     """ The main university page.
     410class InstitutionPage(IkobaDisplayFormPage):
     411    """ The main institution page.
    412412    """
    413413    grok.require('waeup.Public')
    414414    grok.name('index')
    415     grok.context(IUniversity)
     415    grok.context(IInstitution)
    416416    pnav = 0
    417417    label = ''
     
    434434    """
    435435    grok.name('administration')
    436     grok.context(IUniversity)
     436    grok.context(IInstitution)
    437437    grok.require('waeup.managePortal')
    438438    label = _(u'Administration')
     
    443443    """
    444444    grok.name('feed.rss')
    445     grok.context(IUniversity)
     445    grok.context(IInstitution)
    446446    grok.require('waeup.Public')
    447     grok.template('universityrss20feed')
     447    grok.template('institutionrss20feed')
    448448
    449449    name = 'General news feed'
     
    457457    @property
    458458    def title(self):
    459         return getattr(grok.getSite(), 'name', u'Sample University')
     459        return getattr(grok.getSite(), 'name', u'Sample Institution')
    460460
    461461    @property
     
    15681568    """Captcha'd page for all kind of users to request a password change.
    15691569    """
    1570     grok.context(IUniversity)
     1570    grok.context(IInstitution)
    15711571    grok.name('changepw')
    15721572    grok.require('waeup.Anonymous')
     
    15891589        #    email=(email,email))
    15901590        #for result in results:
    1591         #    if result.student_id == identifier or \
     1591        #    if result.customer_id == identifier or \
    15921592        #        result.reg_number == identifier or \
    15931593        #        result.matric_number == identifier:
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/pdf.py

    r11949 r11952  
    710710            doc, 'ikoba_headtitle', getattr(
    711711                site_config, 'name',
    712                 u'Sample University'))
     712                u'Sample Institution'))
    713713        canvas.setFont("Helvetica-Bold", 18)
    714714        if self.header_logo_left_path is not None:
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/templates/customersitelayout.pt

    r11949 r11952  
    33  <head>
    44    <title i18n:translate="">
    5       WAeUP.Ikoba - Student Management System
     5      WAeUP.Ikoba - Application and Registration System
    66    </title>
    77    <!--base href="http://localhost:8080/app/@@page"
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/templates/datacenterexportpage.pt

    r11949 r11952  
    11<p i18n:translate="">
    2   Here you can create CSV files from parts of portal data except student data.
     2  Here you can create CSV files from parts of portal data.
    33  Please pick the type of objects you want to export from the
    44  selection below. The file will be generated and then be
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/templates/loginpage.pt

    r11949 r11952  
    2222  </p>
    2323  <p i18n:translate="login_trouble2" tal:condition="python:False">
    24     You don't have an account because you are a fresh student, or your student record has just been created?
    25     Acquire a Password Activation Code (PWD) and inititialize your student account
     24    You don't have an account because you are a new customer, or your customer record has just been created?
     25    Acquire a Password Activation Code (PWD) and inititialize your customer account
    2626    <strong><a href ="setpassword"> here</a></strong>.
    2727  </p>
    2828  <p i18n:translate="login_trouble4">
    29     You don't have an account because you are a fresh student, or your student record has just been created?
    30     Inititialize your student account <strong><a href="requestpw"> here</a></strong>.
     29    You don't have an account because you are a new customer, or your customer record has just been created?
     30    Inititialize your customer account <strong><a href="requestpw"> here</a></strong>.
    3131  </p>
    32   <p i18n:translate="login_trouble3"> Or simply forgot your student id, application id or password? Then request a new password
     32  <p i18n:translate="login_trouble3"> Or simply forgot your customer id password? Then request a new password
    3333    <strong><a href="changepw"> here</a></strong>.
    3434  </p>
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/templates/staffsitelayout.pt

    r11949 r11952  
    55    <!-- Diazo element-->
    66    <title i18n:translate="">
    7       WAeUP.Ikoba - Student Management System
     7      WAeUP.Ikoba - Application and Registration System
    88    </title> 
    99    <!-- /Diazo element-->
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/tests/test_async.py

    r11949 r11952  
    88from zope.security.interfaces import Unauthorized
    99from zope.testbrowser.testing import Browser
    10 from waeup.ikoba.app import University
     10from waeup.ikoba.app import Institution
    1111from waeup.ikoba.async import AsyncJob, get_job_id
    1212from waeup.ikoba.interfaces import IJobManager
     
    2929        self.storage = os.path.join(self.workdir, 'storage')
    3030        os.mkdir(self.storage)
    31         app = University()
     31        app = Institution()
    3232        app['datacenter'].setStoragePath(self.storage)
    3333
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/tests/test_permissions.py

    r11949 r11952  
    3131from zope.security.interfaces import Unauthorized
    3232from zope.testbrowser.testing import Browser
    33 from waeup.ikoba.app import University
     33from waeup.ikoba.app import Institution
    3434from waeup.ikoba.testing import (
    3535    FunctionalLayer, FunctionalTestCase, get_all_loggers, remove_new_loggers,
     
    5858    def setUp(self):
    5959        super(PermissionTest, self).setUp()
    60         # Set up a complete university to have every page available...
    61         app = University()
     60        # Set up a complete institution to have every page available...
     61        app = Institution()
    6262        self.getRootFolder()['app'] = app
    6363        setSite(self.getRootFolder()['app'])
  • main/waeup.kofa/branches/henrik-regista/src/waeup/ikoba/browser/viewlets.py

    r11949 r11952  
    2424from zope.traversing.browser import absoluteURL
    2525from waeup.ikoba.browser.pages import (
    26     UniversityPage, DatacenterPage,
     26    InstitutionPage, DatacenterPage,
    2727    UsersContainerPage, UserManageFormPage)
    2828from waeup.ikoba.browser.interfaces import (
    29     IBreadcrumbContainer, IUniversity, IUsersContainer)
     29    IBreadcrumbContainer, IInstitution, IUsersContainer)
    3030from waeup.ikoba.interfaces import (
    3131    IIkobaUtils, IIkobaObject, IIkobaXMLExporter,
Note: See TracChangeset for help on using the changeset viewer.