Example #1
0
def projects(request, itest, update_service):
    """Returns 2 new OMERO Projects with required fields set."""
    project = ProjectI()
    project.name = rstring(itest.uuid())
    project = update_service.saveAndReturnObject(project)
    proj = ProjectI()
    proj.name = rstring(itest.uuid())
    proj = update_service.saveAndReturnObject(proj)
    return [project, proj]
Example #2
0
def projects(request, itest, update_service):
    """Returns 2 new OMERO Projects with required fields set."""
    project = ProjectI()
    project.name = rstring(itest.uuid())
    project = update_service.saveAndReturnObject(project)
    proj = ProjectI()
    proj.name = rstring(itest.uuid())
    proj = update_service.saveAndReturnObject(proj)
    return [project, proj]
Example #3
0
 def projects(self):
     """Returns 2 new OMERO Projects with required fields set."""
     project = ProjectI()
     project.name = rstring(self.uuid())
     project = self.update.saveAndReturnObject(project)
     proj = ProjectI()
     proj.name = rstring(self.uuid())
     proj = self.update.saveAndReturnObject(proj)
     return [project, proj]
Example #4
0
    def test_project_validation(self, user_A):
        """
        Test to demonstrate details bug on encode->decode.

        Test illustrates the ValidationException we see when
        Project is encoded to dict then decoded back to Project
        and saved.
        No exception is seen if the original Project is simply
        saved without encode & decode OR if the details are unloaded
        before saving
        """
        conn = get_connection(user_A)
        project = ProjectI()
        project.name = rstring('test_project_validation')
        project = conn.getUpdateService().saveAndReturnObject(project)

        # Saving original Project again is OK
        conn.getUpdateService().saveObject(project)

        # encode and decode before Save raises Validation Exception
        project_json = get_encoder(project.__class__).encode(project)
        decoder = get_decoder(project_json['@type'])
        p = decoder.decode(project_json)
        with pytest.raises(ValidationException):
            conn.getUpdateService().saveObject(p)

        p = decoder.decode(project_json)
        # Unloading details allows Save without exception
        p.unloadDetails()
        conn.getUpdateService().saveObject(p)
Example #5
0
    def project_datasets(self, user1):
        """Return Project with Datasets and an orphaned Dataset."""
        # Create and name all the objects
        project = ProjectI()
        project.name = rstring('Project')

        # Create 5 Datasets, each with 0-4 images.
        for d in range(5):
            dataset1 = DatasetI()
            dataset1.name = rstring('Dataset%s' % d)
            for i in range(d):
                image = self.create_test_image(size_x=5,
                                               size_y=5,
                                               session=user1[0].getSession(),
                                               name="Image%s" % i)
                image = ImageI(image.id.val, False)
                dataset1.linkImage(image)
            project.linkDataset(dataset1)

        # Create single orphaned Dataset
        dataset = DatasetI()
        dataset.name = rstring('Dataset')

        project = get_update_service(user1).saveAndReturnObject(project)
        dataset = get_update_service(user1).saveAndReturnObject(dataset)
        return project, dataset
    def test_project_delete(self, user1):
        conn = get_connection(user1)
        user_name = conn.getUser().getName()
        django_client = self.new_django_client(user_name, user_name)

        project = ProjectI()
        project.name = rstring('test_project_delete')
        project.description = rstring('Test update')
        project = get_update_service(user1).saveAndReturnObject(project)
        version = api_settings.API_VERSIONS[-1]
        project_url = reverse('api_project',
                              kwargs={'api_version': version,
                                      'object_id': project.id.val})
        # Before delete, we can read
        pr_json = get_json(django_client, project_url)
        assert pr_json['data']['Name'] == 'test_project_delete'
        # Delete
        delete_json(django_client, project_url, {})
        # Get should now return 404
        rsp = get_json(django_client, project_url, status_code=404)
        assert rsp['message'] == 'Project %s not found' % project.id.val
        # Delete (again) should return 404
        rsp = delete_json(django_client, project_url, {}, status_code=404)
        assert rsp['message'] == 'Project %s not found' % project.id.val
        save_url = reverse('api_save', kwargs={'api_version': version})
        # TODO: Try to save deleted object - should return ApiException
        # see https://trello.com/c/qWNt9vLN/178-save-deleted-object
        with pytest.raises(AssertionError):
            rsp = put_json(django_client, save_url, pr_json, status_code=400)
            assert rsp['message'] == 'Project %s not found' % project.id.val
    def project_hierarchy_user1_group1(self, user1):
        """
        Returns OMERO Projects with Dataset Children with Image Children

        Note: This returns a list of mixed objects in a specified order
        """

        # Create and name all the objects
        project1 = ProjectI()
        project1.name = rstring('Project1')
        project2 = ProjectI()
        project2.name = rstring('Project2')
        dataset1 = DatasetI()
        dataset1.name = rstring('Dataset1')
        dataset2 = DatasetI()
        dataset2.name = rstring('Dataset2')
        image1 = self.new_image(name='Image1')
        image2 = self.new_image(name='Image2')

        # Link them together like so:
        # project1
        #   dataset1
        #       image1
        #       image2
        #   dataset2
        #       image2
        # project2
        #   dataset2
        #       image2
        project1.linkDataset(dataset1)
        project1.linkDataset(dataset2)
        project2.linkDataset(dataset2)
        dataset1.linkImage(image1)
        dataset1.linkImage(image2)
        dataset2.linkImage(image2)

        to_save = [project1, project2]
        projects = get_update_service(user1).saveAndReturnArray(to_save)
        projects.sort(key=lambda x: lower_or_none(unwrap(x.name)))

        datasets = projects[0].linkedDatasetList()
        datasets.sort(key=lambda x: lower_or_none(unwrap(x.name)))

        images = datasets[0].linkedImageList()
        images.sort(key=lambda x: lower_or_none(unwrap(x.name)))

        return projects + datasets + images
def project_userA(request, userA, groupA):
    """
    Returns new OMERO Project
    """
    ctx = {'omero.group': str(groupA.id.val)}
    project = ProjectI()
    project.name = rstring("test_tree_annnotations")
    project = get_update_service(userA).saveAndReturnObject(project, ctx)
    return project
def project_userA(request, userA, groupA):
    """
    Returns new OMERO Project
    """
    ctx = {'omero.group': str(groupA.id.val)}
    project = ProjectI()
    project.name = rstring("test_tree_annnotations")
    project = get_update_service(userA).saveAndReturnObject(project, ctx)
    return project
Example #10
0
def project_dataset(request, itest, update_service):
    """
    Returns a new OMERO Project and linked Dataset with required fields set.
    """
    project = ProjectI()
    project.name = rstring(itest.uuid())
    dataset = DatasetI()
    dataset.name = rstring(itest.uuid())
    project.linkDataset(dataset)
    return update_service.saveAndReturnObject(project)
Example #11
0
def project_dataset(request, itest, update_service):
    """
    Returns a new OMERO Project and linked Dataset with required fields set.
    """
    project = ProjectI()
    project.name = rstring(itest.uuid())
    dataset = DatasetI()
    dataset.name = rstring(itest.uuid())
    project.linkDataset(dataset)
    return update_service.saveAndReturnObject(project)
Example #12
0
 def project_dataset(self):
     """
     Returns a new OMERO Project and linked Dataset with required fields
     set.
     """
     project = ProjectI()
     project.name = rstring(self.uuid())
     dataset = DatasetI()
     dataset.name = rstring(self.uuid())
     project.linkDataset(dataset)
     return self.update.saveAndReturnObject(project)
Example #13
0
    def test_project_update(self, user1):
        conn = get_connection(user1)
        group = conn.getEventContext().groupId
        user_name = conn.getUser().getName()
        django_client = self.new_django_client(user_name, user_name)

        project = ProjectI()
        project.name = rstring('test_project_update')
        project.description = rstring('Test update')
        project = get_update_service(user1).saveAndReturnObject(project)

        # Update Project in 2 ways...
        version = api_settings.API_VERSIONS[-1]
        project_url = reverse('api_project',
                              kwargs={
                                  'api_version': version,
                                  'object_id': project.id.val
                              })
        save_url = reverse('api_save', kwargs={'api_version': version})
        # 1) Get Project, update and save back
        rsp = get_json(django_client, project_url)
        project_json = rsp['data']
        assert project_json['Name'] == 'test_project_update'
        project_json['Name'] = 'new name'
        rsp = put_json(django_client, save_url, project_json)
        project_json = rsp['data']
        assert project_json['@id'] == project.id.val
        assert project_json['Name'] == 'new name'  # Name has changed
        assert project_json['Description'] == 'Test update'  # No change

        # 2) Put from scratch (will delete empty fields, E.g. Description)
        save_url += '?group=' + str(group)
        payload = {'Name': 'updated name', '@id': project.id.val}
        # Test error message if we don't pass @type:
        rsp = put_json(django_client, save_url, payload, status_code=400)
        assert rsp['message'] == 'Need to specify @type attribute'
        # Add @type and try again
        payload['@type'] = project_json['@type']
        rsp = put_json(django_client, save_url, payload)
        project_json = rsp['data']
        assert project_json['@id'] == project.id.val
        assert project_json['Name'] == 'updated name'
        assert 'Description' not in project_json
        # Get project again to check update
        rsp = get_json(django_client, project_url)
        pr_json = rsp['data']
        assert pr_json['Name'] == 'updated name'
        assert 'Description' not in pr_json
        # Now add description and save again
        pr_json['Description'] = 'New test description update'
        put_json(django_client, save_url, pr_json)
        # Read to check
        rsp = get_json(django_client, project_url)
        assert rsp['data']['Description'] == 'New test description update'
 def projects_dataset_image_tag(self):
     """
     Returns 2 new OMERO Projects, linked Dataset and linked Image populated
     by an L{test.integration.library.ITest} instance with required fields
     set. Also a Tag linked to both Projects.
     """
     project1 = ProjectI()
     project1.name = rstring(self.uuid())
     project2 = ProjectI()
     project2.name = rstring(self.uuid())
     dataset = DatasetI()
     dataset.name = rstring(self.uuid())
     image = self.new_image(name=self.uuid())
     dataset.linkImage(image)
     project1.linkDataset(dataset)
     project2.linkDataset(dataset)
     tag = TagAnnotationI()
     tag.textValue = rstring("ChgrpTag")
     project1.linkAnnotation(tag)
     project2.linkAnnotation(tag)
     return self.update.saveAndReturnArray([project1, project2])
 def projects_dataset_image_tag(self):
     """
     Returns 2 new OMERO Projects, linked Dataset and linked Image populated
     by an L{test.integration.library.ITest} instance with required fields
     set. Also a Tag linked to both Projects.
     """
     project1 = ProjectI()
     project1.name = rstring(f'P1_{self.uuid()}')
     project2 = ProjectI()
     project2.name = rstring(f'P2_{self.uuid()}')
     dataset = DatasetI()
     dataset.name = rstring(f'D{self.uuid()}')
     image = self.new_image(f'I{self.uuid()}')
     dataset.linkImage(image)
     project1.linkDataset(dataset)
     project2.linkDataset(dataset)
     tag = TagAnnotationI()
     tag.textValue = rstring("ChgrpTag")
     project1.linkAnnotation(tag)
     project2.linkAnnotation(tag)
     return self.update.saveAndReturnArray([project1, project2])
def projects_userA(request, userA, groupA):
    """
    Returns new OMERO Project
    """
    to_save = []
    ctx = {'omero.group': str(groupA.id.val)}
    for name in "test_ann1", "test_ann2":
        project = ProjectI()
        project.name = rstring(name)
        to_save.append(project)
    projects = get_update_service(userA).saveAndReturnArray(to_save, ctx)
    return projects
def projects_userA(request, userA, groupA):
    """
    Returns new OMERO Project
    """
    to_save = []
    ctx = {'omero.group': str(groupA.id.val)}
    for name in "test_ann1", "test_ann2":
        project = ProjectI()
        project.name = rstring(name)
        to_save.append(project)
    projects = get_update_service(userA).saveAndReturnArray(
        to_save, ctx)
    return projects
Example #18
0
def projects_user2_group1(request, names2, user2):
    """
    Returns a new OMERO Project with required fields set and with a name
    that can be used to exercise sorting semantics.
    """
    to_save = []
    for name in names2:
        project = ProjectI()
        project.name = rstring(name)
        to_save.append(project)
    projects = get_update_service(user2).saveAndReturnArray(to_save)
    projects.sort(cmp_name_insensitive)
    return projects
Example #19
0
    def test_project(self):
        """Tests BlitzObjectWrapper.getName() returns string"""
        name = u'Pròjëct ©ψ'
        desc = u"Desc Φωλ"
        project = ProjectI()
        project.name = rstring(name)
        project.description = rstring(desc)

        proj = MockConnection(project).getObject("Project", 1)
        assert proj.getName() == name.encode('utf8')
        assert proj.name == name
        assert proj.getDescription() == desc.encode('utf8')
        assert proj.description == desc
Example #20
0
def project_dataset_image(request, itest, update_service):
    """
    Returns a new OMERO Project, linked Dataset and linked Image populated
    by an L{test.integration.library.ITest} instance with required fields
    set.
    """
    project = ProjectI()
    project.name = rstring(itest.uuid())
    dataset = DatasetI()
    dataset.name = rstring(itest.uuid())
    image = itest.new_image(name=itest.uuid())
    dataset.linkImage(image)
    project.linkDataset(dataset)
    return update_service.saveAndReturnObject(project)
Example #21
0
 def project_dataset_image(self):
     """
     Returns a new OMERO Project, linked Dataset and linked Image populated
     by an L{test.integration.library.ITest} instance with required fields
     set.
     """
     project = ProjectI()
     project.name = rstring(self.uuid())
     dataset = DatasetI()
     dataset.name = rstring(self.uuid())
     image = self.new_image(name=self.uuid())
     dataset.linkImage(image)
     project.linkDataset(dataset)
     return self.update.saveAndReturnObject(project)
def projects_user1_group1(request, names1, user1,
                          project_hierarchy_user1_group1):
    """
    Returns new OMERO Projects with required fields set and with names
    that can be used to exercise sorting semantics.
    """
    to_save = []
    for name in names1:
        project = ProjectI()
        project.name = rstring(name)
        to_save.append(project)
    projects = get_update_service(user1).saveAndReturnArray(to_save)
    projects.extend(project_hierarchy_user1_group1[:2])
    projects.sort(key=lambda x: lower_or_none(unwrap(x.name)))
    return projects
def projects_user1_group2(request, names3, user1, group2):
    """
    Returns new OMERO Projects with required fields set and with names
    that can be used to exercise sorting semantics.
    """
    to_save = []
    for name in names3:
        project = ProjectI()
        project.name = rstring(name)
        to_save.append(project)
    conn = get_connection(user1, group2.id.val)
    projects = conn.getUpdateService().saveAndReturnArray(to_save,
                                                          conn.SERVICE_OPTS)
    projects.sort(key=lambda x: lower_or_none(unwrap(x.name)))
    return projects
Example #24
0
 def datasets(self):
     """
     Returns four new OMERO Datasets with required fields set and with
     names that can be used to exercise sorting semantics.
     """
     to_save = [DatasetI(), DatasetI(), DatasetI(), DatasetI()]
     for index, dataset in enumerate(to_save):
         dataset.name = rstring(self.names[index])
     # Non-orphaned Dataset to catch issues with queries where non-orphaned
     # datasets are included in the results.
     project = ProjectI()
     project.name = rstring(self.uuid())
     dataset = DatasetI()
     dataset.name = rstring(self.uuid())
     project.linkDataset(dataset)
     self.update.saveAndReturnObject(project)
     return self.update.saveAndReturnArray(to_save)
Example #25
0
def datasets(request, itest, update_service, names):
    """
    Returns four new OMERO Datasets with required fields set and with names
    that can be used to exercise sorting semantics.
    """
    to_save = [DatasetI(), DatasetI(), DatasetI(), DatasetI()]
    for index, dataset in enumerate(to_save):
        dataset.name = rstring(names[index])
    # Non-orphaned Dataset to catch issues with queries where non-orphaned
    # datasets are included in the results.
    project = ProjectI()
    project.name = rstring(itest.uuid())
    dataset = DatasetI()
    dataset.name = rstring(itest.uuid())
    project.linkDataset(dataset)
    update_service.saveAndReturnObject(project)
    return update_service.saveAndReturnArray(to_save)
Example #26
0
def projects_different_users(request, itest, conn):
    """
    Returns two new OMERO Projects created by different users with
    required fields set.
    """
    client = conn.c
    group = conn.getGroupFromContext()._obj
    projects = list()
    # User that has already been created by the "client" fixture
    user, name = itest.user_and_name(client)
    itest.add_experimenters(group, [user])
    for name in (rstring(itest.uuid()), rstring(itest.uuid())):
        client, user = itest.new_client_and_user(group=group)
        try:
            project = ProjectI()
            project.name = name
            update_service = client.getSession().getUpdateService()
            projects.append(update_service.saveAndReturnObject(project))
        finally:
            client.closeSession()
    return projects
Example #27
0
 def projects_different_users(self):
     """
     Returns two new OMERO Projects created by different users with
     required fields set.
     """
     client = self.conn.c
     group = self.conn.getGroupFromContext()._obj
     projects = list()
     # User that has already been created by the "client" fixture
     user, name = self.user_and_name(client)
     self.add_experimenters(group, [user])
     for name in (rstring(self.uuid()), rstring(self.uuid())):
         client, user = self.new_client_and_user(group=group)
         try:
             project = ProjectI()
             project.name = name
             update_service = client.getSession().getUpdateService()
             projects.append(update_service.saveAndReturnObject(project))
         finally:
             client.closeSession()
     return projects
Example #28
0
def create_project(with_datasets=False, with_images=False):
    project = ProjectI()
    project.id = rlong(1L)
    project.name = rstring("the_name")
    project.description = rstring("the_description")
    dataset_count = 2

    if not with_datasets:
        return project
    for dataset_id in range(0, dataset_count):
        dataset = DatasetI()
        dataset.id = rlong(dataset_id + 1)
        dataset.name = rstring("dataset_name_%d" % (dataset_id + 1))
        dataset.description = rstring("dataset_description_%d" % (dataset_id + 1))
        project.linkDataset(dataset)
        if not with_images:
            continue
        for image_id in range(1, 3):
            image_id = (dataset_id * dataset_count) + image_id
            dataset.linkImage(create_image(image_id))
    return project
Example #29
0
def create_project(with_datasets=False, with_images=False):
    project = ProjectI()
    project.id = rlong(1)
    project.name = rstring('the_name')
    project.description = rstring('the_description')
    dataset_count = 2

    if not with_datasets:
        return project
    for dataset_id in range(0, dataset_count):
        dataset = DatasetI()
        dataset.id = rlong(dataset_id + 1)
        dataset.name = rstring('dataset_name_%d' % (dataset_id + 1))
        dataset.description = rstring('dataset_description_%d' %
                                      (dataset_id + 1))
        project.linkDataset(dataset)
        if not with_images:
            continue
        for image_id in range(1, 3):
            image_id = (dataset_id * dataset_count) + image_id
            dataset.linkImage(create_image(image_id))
    return project
Example #30
0
 def create_project(self, conn, project_name):
     print "Createing new Project: ", project_name
     p = ProjectI()
     p.name = wrap(project_name)
     return conn.getUpdateService().saveAndReturnObject(p)
 def project(self):
     """Returns a new OMERO Project with required fields set."""
     project = ProjectI()
     project.name = rstring(self.uuid())
     return self.update.saveAndReturnObject(project)
    def test_chgrp_old_container(self, dataset, credentials):
        """
        Tests Admin moving user's Dataset to their Private group and
        linking it to an existing Project there.
        Bug from https://github.com/openmicroscopy/openmicroscopy/pull/3420
        """

        django_client = self.get_django_client(credentials)
        # user creates project in their target group
        project = ProjectI()
        projectName = "chgrp-target-%s" % self.client.getSessionId()
        project.name = rstring(projectName)
        ctx = {"omero.group": native_str(self.group2.id.val)}
        project = self.sf.getUpdateService().saveAndReturnObject(project, ctx)
        request_url = reverse('chgrp')

        data = {
            "group_id": self.group2.id.val,
            "Dataset": dataset.id.val,
            "target_id": "project-%s" % project.id.val,
        }
        rsp = post(django_client, request_url, data)
        data = json.loads(rsp.content)
        expected = {
            "update": {
                "childless": {
                    "project": [],
                    "orphaned": False,
                    "dataset": []
                },
                "remove": {
                    "project": [],
                    "plate": [],
                    "screen": [],
                    "image": [],
                    "dataset": [dataset.id.val]
                }
            }
        }
        assert data == expected

        activities_url = reverse('activities_json')

        data = get_json(django_client, activities_url)

        # Keep polling activities until no jobs in progress
        while data['inprogress'] > 0:
            time.sleep(0.5)
            data = get_json(django_client, activities_url)

        # individual activities/jobs are returned as dicts within json data
        for k, o in list(data.items()):
            if hasattr(o, 'values'):  # a dict
                if 'report' in o:
                    print(o['report'])
                assert o['status'] == 'finished'
                assert o['job_name'] == 'Change group'
                assert o['to_group_id'] == self.group2.id.val

        # Dataset should now be in new group, contained in Project
        conn = BlitzGateway(client_obj=self.client)
        userId = conn.getUserId()
        conn.SERVICE_OPTS.setOmeroGroup('-1')
        d = conn.getObject("Dataset", dataset.id.val)
        assert d is not None
        assert d.getDetails().group.id.val == self.group2.id.val
        p = d.getParent()
        assert p is not None
        assert p.getName() == projectName
        # Project owner should be current user
        assert p.getDetails().owner.id.val == userId
        assert p.getId() == project.id.val
Example #33
0
def project(request, itest, update_service):
    """Returns a new OMERO Project with required fields set."""
    project = ProjectI()
    project.name = rstring(itest.uuid())
    return update_service.saveAndReturnObject(project)
Example #34
0
 def create_project(self, conn, project):
     print "Creating new Project:", project
     p = ProjectI()
     p.name = wrap(project.encode('ascii','ignore'))
     return conn.getUpdateService().saveAndReturnObject(p)
Example #35
0
def project(request, itest, update_service):
    """Returns a new OMERO Project with required fields set."""
    project = ProjectI()
    project.name = rstring(itest.uuid())
    return update_service.saveAndReturnObject(project)
    def test_chgrp_old_container(self, dataset, credentials):
        """
        Tests Admin moving user's Dataset to their Private group and
        linking it to an existing Project there.
        Bug from https://github.com/openmicroscopy/openmicroscopy/pull/3420
        """

        django_client = self.get_django_client(credentials)
        # user creates project in their target group
        project = ProjectI()
        projectName = "chgrp-target-%s" % self.client.getSessionId()
        project.name = rstring(projectName)
        ctx = {"omero.group": str(self.group2.id.val)}
        project = self.sf.getUpdateService().saveAndReturnObject(project, ctx)
        request_url = reverse('chgrp')

        data = {
            "group_id": self.group2.id.val,
            "Dataset": dataset.id.val,
            "target_id": "project-%s" % project.id.val,
        }
        data = _csrf_post_response_json(django_client, request_url, data)
        expected = {"update": {"childless": {"project": [],
                                             "orphaned": False,
                                             "dataset": []},
                               "remove": {"project": [],
                                          "plate": [],
                                          "screen": [],
                                          "image": [],
                                          "dataset": [dataset.id.val]}}}
        assert data == expected

        activities_url = reverse('activities_json')

        data = _get_response_json(django_client, activities_url, {})

        # Keep polling activities until no jobs in progress
        while data['inprogress'] > 0:
            time.sleep(0.5)
            data = _get_response_json(django_client, activities_url, {})

        # individual activities/jobs are returned as dicts within json data
        for k, o in data.items():
            if hasattr(o, 'values'):    # a dict
                if 'report' in o:
                    print o['report']
                assert o['status'] == 'finished'
                assert o['job_name'] == 'Change group'
                assert o['to_group_id'] == self.group2.id.val

        # Dataset should now be in new group, contained in Project
        conn = BlitzGateway(client_obj=self.client)
        userId = conn.getUserId()
        conn.SERVICE_OPTS.setOmeroGroup('-1')
        d = conn.getObject("Dataset", dataset.id.val)
        assert d is not None
        assert d.getDetails().group.id.val == self.group2.id.val
        p = d.getParent()
        assert p is not None
        assert p.getName() == projectName
        # Project owner should be current user
        assert p.getDetails().owner.id.val == userId
        assert p.getId() == project.id.val
 def project(self):
     """Returns a new OMERO Project with required fields set."""
     project = ProjectI()
     project.name = rstring(self.uuid())
     return self.update.saveAndReturnObject(project)
def project():
    o = ProjectI()
    o.id = rlong(1L)
    o.name = rstring('the_name')
    o.description = rstring('the_description')
    return o
Example #39
0
def project():
    o = ProjectI()
    o.id = rlong(1L)
    o.name = rstring('the_name')
    o.description = rstring('the_description')
    return o