示例#1
0
    def _getListConfig(self):
        """See ConversationList._getListConfig for full specification."""

        list_config = lists.ListConfiguration()

        def createHtml(e, *args):
            return conversation_list_cell.ConversationListCell(
                self.data, e.conversation).render()

        def rowAction(e, *args):
            self.data.redirect.id(id=e.conversation.integer_id())
            return self.data.redirect.urlOf(url_names.GCI_CONVERSATION)

        list_config.addHtmlColumn('conversation', 'Conversation', createHtml)
        list_config.addPlainTextColumn(
            'subject',
            'Subject',
            lambda e, *args: e.conversation.get().subject,
            hidden=True)
        list_config.addPlainTextColumn(
            'last_message_on',
            'Last Message Time (raw)',
            lambda e, *args: e.conversation.get().last_message_on,
            hidden=True)
        list_config.addPlainTextColumn(
            'last_message_on_ctime',
            'Last Message Time',
            lambda e, *args: e.conversation.get().last_message_on.ctime(),
            hidden=True)

        list_config.setDefaultPagination(20)
        list_config.setDefaultSort('last_message_on', order='desc')
        list_config.setRowAction(rowAction)

        return list_config
示例#2
0
  def _getListConfig(self):
    """See ConnectionList._getListConfig for specification."""
    list_config = lists.ListConfiguration(add_key_column=False)
    list_config.addPlainTextColumn('key', 'Key',
        lambda e, *args: e.keyName(), hidden=True)

    list_config.addPlainTextColumn('username', 'Username',
        lambda e, *args: e.key.parent().parent().id())

    # organization column is added only when the user is an admin for
    # more than one organization
    if len(self.data.url_ndb_profile.admin_for) > 1:
      list_config.addPlainTextColumn('organization', 'Organization',
          lambda e, *args: e.organization.get().name)

    list_config.addPlainTextColumn('role', 'Role',
        lambda e, *args: connection_model.VERBOSE_ROLE_NAMES[e.getRole()])
    list_config.addPlainTextColumn('seen', 'Seen By Org',
        lambda e, *args: 'Yes' if e.seen_by_org else 'No')
    list_config.addDateColumn('last_modified', 'Last Modified On',
        lambda e, *args: e.last_modified)

    list_config.setRowAction(
        lambda e, *args: links.LINKER.userId(
            e.key.parent(), e.key.id(),
            self.url_names.CONNECTION_MANAGE_AS_ORG))

    return list_config
示例#3
0
    def __init__(self, data, survey):
        """Initializes the component.

    Args:
      data: The RequestData object
      survey: the OrgApplicationSurvey entity
    """
        super(MyOrgApplicationsComponent, self).__init__(data)

        # passed in so we don't have to do double queries
        self.survey = survey

        list_config = lists.ListConfiguration()

        list_config.addSimpleColumn('name', 'Name')
        list_config.addSimpleColumn('org_id', 'Organization ID')
        list_config.addSimpleColumn('created',
                                    'Created On',
                                    column_type=lists.DATE)
        list_config.addSimpleColumn('modified',
                                    'Last Modified On',
                                    column_type=lists.DATE)

        if self.data.timeline.surveyPeriod(survey):
            url_name = 'gci_retake_org_app'
        else:
            url_name = 'gci_show_org_app'

        list_config.setRowAction(lambda entity, *args: data.redirect.id(
            entity.key().id()).urlOf(url_name))

        self._list_config = list_config

        super(MyOrgApplicationsComponent, self).__init__(data)
示例#4
0
 def _getListConfig(self):
     """Returns ListConfiguration object for the list.
 """
     list_config = lists.ListConfiguration()
     list_config.addPlainTextColumn('name', 'Name',
                                    lambda e, *args: e.name.strip())
     list_config.addSimpleColumn('link_id', 'Link ID', hidden=True)
     list_config.setRowAction(self._getRedirect())
     return list_config
示例#5
0
    def __init__(self, data):
        self.data = data

        list_config = lists.ListConfiguration()
        list_config.addSimpleColumn('title', 'Title')
        list_config.setRowAction(lambda e, *args: data.redirect.id(e.key().id(
        )).urlOf('gci_view_task'))

        self._list_config = list_config
示例#6
0
 def __init__(self, data):
   """See template.Template.__init__ for specification."""
   super(PublicOrganizationList, self).__init__(data)
   self._list_config = lists.ListConfiguration()
   self._list_config.addPlainTextColumn(
       'name', 'Name', lambda e, *args: e.name.strip())
   self._list_config.addPlainTextColumn(
       'tags', 'Tags', lambda e, *args: ', '.join(e.tags))
   self._list_config.addPlainTextColumn('ideas', 'Ideas',
       lambda e, *args: url_helper.urlize(e.ideas, name='[ideas page]'),
       hidden=True)
示例#7
0
    def _getListConfig(self):
        """See ConversationList._getListConfig for full specification."""

        list_config = lists.ListConfiguration()

        list_config.addPlainTextColumn(
            'user', 'Username',
            lambda e, *args: db.get(ndb.Key.to_old_key(e.user)).name)

        list_config.setDefaultPagination(30)

        return list_config
示例#8
0
    def __init__(self, data, edit_name):
        self.data = data

        list_config = lists.ListConfiguration()
        list_config.addSimpleColumn('title', 'Title')
        list_config.addSimpleColumn('link_id', 'Document ID', hidden=True)
        list_config.setRowAction(
            lambda e, *args: data.redirect.document(e).urlOf(edit_name))

        list_config.setDefaultPagination(False)
        list_config.setDefaultSort('title')

        self._list_config = list_config
示例#9
0
    def __init__(self, data):
        """Initializes this component.
    """
        self.data = data
        list_config = lists.ListConfiguration()
        list_config.addPlainTextColumn('title', 'Title',
                                       lambda entity, *args: entity.name())

        list_config.setRowAction(lambda entity, *args: self.data.redirect.
                                 document(entity).urlOf('show_gci_document'))

        self._list_config = list_config

        super(DocumentComponent, self).__init__(data)
示例#10
0
    def __init__(self, data):
        self.data = data

        list_config = lists.ListConfiguration()
        list_config.addPlainTextColumn('student', 'Student',
                                       lambda e, *args: e.parent().name())
        list_config.addSimpleColumn('points', 'Points')
        list_config.addNumericalColumn('tasks', 'Tasks',
                                       lambda e, *args: len(e.tasks))
        list_config.setDefaultSort('points', 'desc')

        list_config.setRowAction(lambda e, *args: data.redirect.profile(
            e.parent().link_id).urlOf(url_names.GCI_STUDENT_TASKS))

        self._list_config = list_config
示例#11
0
    def __init__(self, data):
        """Initializes the component.

    Args:
      data: The RequestData object
    """
        super(MyOrgsMentorsList, self).__init__(data)

        list_config = lists.ListConfiguration()

        list_config.addSimpleColumn('public_name', 'Name')
        list_config.addSimpleColumn('link_id', 'Username')
        list_config.addSimpleColumn('email', 'Email')

        self._list_config = list_config
示例#12
0
    def __init__(self, data):
        self.data = data

        list_config = lists.ListConfiguration()

        list_config.addSimpleColumn('title', 'Title')
        list_config.addPlainTextColumn(
            'student', 'Student', lambda entity, *args: entity.student.name())
        list_config.addPlainTextColumn(
            'types', 'Type', lambda entity, *args: ", ".join(entity.types))

        list_config.setRowAction(lambda e, *args: data.redirect.id(e.key().id(
        )).urlOf(url_names.GCI_VIEW_TASK))

        self.list_config = list_config
示例#13
0
    def __init__(self, data):
        self.data = data

        list_config = lists.ListConfiguration()
        list_config.addPlainTextColumn('student', 'Student',
                                       lambda e, *args: e.parent().name())
        list_config.addNumericalColumn('tasks', 'Tasks',
                                       lambda e, *args: e.numberOfTasks())
        list_config.setDefaultSort('tasks', 'desc')

        list_config.setRowAction(
            lambda e, *args: data.redirect.userOrg(user=e.parent(
            ).link_id).urlOf(url_names.GCI_STUDENT_TASKS_FOR_ORG))

        self._list_config = list_config
示例#14
0
    def _getListConfig(self):
        """See org_list.OrgList._getListConfig for specification."""
        list_config = lists.ListConfiguration()

        list_config.addPlainTextColumn('name', 'Name',
                                       lambda e, *args: e.name.strip())

        list_config.addSimpleColumn('org_id', 'Organization ID', hidden=True)

        options = [('', 'All'), ('true', 'New'), ('false', 'Veteran')]
        list_config.addPlainTextColumn('is_veteran',
                                       'New/Veteran',
                                       lambda e, *args: 'Veteran'
                                       if e.is_veteran else 'New',
                                       width=60,
                                       options=options)
        list_config.setColumnEditable('is_veteran', True, 'select')

        list_config.addSimpleColumn('slot_request_min',
                                    'Min',
                                    width=25,
                                    column_type=lists.NUMERICAL)
        list_config.addSimpleColumn('slot_request_max',
                                    'Max',
                                    width=25,
                                    column_type=lists.NUMERICAL)

        list_config.addSimpleColumn('slot_allocation',
                                    'Slots',
                                    width=50,
                                    column_type=lists.NUMERICAL)
        list_config.setColumnEditable('slot_allocation', True)
        list_config.setColumnSummary('slot_allocation', 'sum',
                                     '<b>Total: {0}</b>')

        list_config.addHtmlColumn(
            'slots_unused', 'Unused slots', lambda ent, s, *args:
            ('<strong><font color="red">%s</font></strong>' % (s[ent.key])))

        # TODO(daniel): add note to organization model?
        #list_config.addSimpleColumn('note', 'Note')
        #list_config.setColumnEditable('note', True)

        list_config.setDefaultPagination(False)
        list_config.setDefaultSort('name')
        list_config.addPostEditButton('save', 'Save', "", [], refresh='none')

        return list_config
示例#15
0
    def __init__(self, data):
        def getOrganization(entity, *args):
            """Helper function to get value of organization column."""
            org_key = project_model.GSoCProject.org.get_value_for_datastore(
                entity)
            return ndb.Key.from_old_key(org_key).get().name

        def getStudent(entity, *args):
            """Helper function to get value of student column."""
            return ndb.Key.from_old_key(entity.parent_key()).get().public_name

        self.data = data

        list_config = lists.ListConfiguration()
        list_config.addPlainTextColumn('student', 'Student', getStudent)
        list_config.addSimpleColumn('title', 'Title')
        list_config.addPlainTextColumn('org', 'Organization', getOrganization)

        def status(project):
            """Status to show on the list with color.
      """
            if project.status == project_model.STATUS_ACCEPTED:
                return """<strong><font color="green">Accepted</font><strong>"""
            elif project.status == 'withdrawn':
                return """<strong><font color="red">Withdrawn</font></strong>"""

            return project.status

        list_config.addHtmlColumn('status', 'Status',
                                  lambda entity, *args: status(entity))

        list_config.setDefaultPagination(False)
        list_config.setDefaultSort('student')

        # hidden keys
        list_config.addPlainTextColumn('full_project_key',
                                       'Full project key',
                                       lambda ent, *args: str(ent.key()),
                                       hidden=True)

        # action button
        bounds = [1, 'all']
        keys = ['full_project_key']
        list_config.addPostButton('withdraw', "Withdraw", "", bounds, keys)
        list_config.addPostButton('accept', "Accept", "", bounds, keys)

        self._list_config = list_config
示例#16
0
    def __init__(self, data):
        """Initializes the component.

    Args:
      data: The RequestData object
    """
        super(MyOrgsList, self).__init__(data)

        list_config = lists.ListConfiguration()

        list_config.addSimpleColumn('name', 'Organization Name')

        self._list_config = list_config

        self._setRowAction(data.request, data)

        self._setIdx()
示例#17
0
    def __init__(self, data, description):
        """See template.Template.__init__ for specification."""
        super(ProjectList, self).__init__(data)
        self._list_config = lists.ListConfiguration()

        def getStudent(entity, *args):
            """Helper function to get value for student column."""
            return ndb.Key.from_old_key(entity.parent_key()).get().public_name

        self._list_config.addPlainTextColumn('student', 'Student', getStudent)

        self._list_config.addSimpleColumn('title', 'Title')
        self._list_config.addPlainTextColumn(
            'mentors', 'Mentors', lambda entity, m, *args: ', '.join(
                mentor.public_name for mentor in entity.getMentors()))

        self._list_config.setDefaultSort('student')
        self._description = description
示例#18
0
  def _getListConfig(self):
    """See ConnectionList._getListConfig for specification."""
    list_config = lists.ListConfiguration(add_key_column=False)
    list_config.addPlainTextColumn('key', 'Key',
        lambda e, *args: e.keyName(), hidden=True)
    list_config.addPlainTextColumn('organization', 'Organization',
        lambda e, *args: e.organization.get().name)
    list_config.addPlainTextColumn('role', 'Role',
        lambda e, *args: connection_model.VERBOSE_ROLE_NAMES[e.getRole()])
    list_config.addDateColumn('last_modified', 'Last Modified On',
        lambda e, *args: e.last_modified)

    list_config.setRowAction(
        lambda e, *args: links.LINKER.userId(
            e.key.parent(), e.key.id(),
            self.url_names.CONNECTION_MANAGE_AS_USER))

    return list_config
示例#19
0
    def __init__(self, request, data):
        def getOrganization(entity, *args):
            """Helper function to get value of organization column."""
            org_key = GSoCProject.org.get_value_for_datastore(entity)
            return ndb.Key.from_old_key(org_key).get().name

        self.data = data

        list_config = lists.ListConfiguration()
        list_config.addPlainTextColumn(
            'student', 'Student', lambda entity, *args: entity.parent().name())
        list_config.addSimpleColumn('title', 'Title')
        list_config.addPlainTextColumn('org', 'Organization', getOrganization)
        list_config.addPlainTextColumn(
            'mentors', 'Mentor',
            lambda entity, m, *args: [m[i].name() for i in entity.mentors])
        list_config.setDefaultPagination(False)
        list_config.setDefaultSort('student')

        self._list_config = list_config
示例#20
0
    def __init__(self, data):
        """Initializes a new object.

    Args:
      data: RequestData object associated with the request.
    """
        self.data = data

        list_config = lists.ListConfiguration()
        list_config.addPlainTextColumn(
            'name', 'Name', lambda entity, *args: entity.content.filename)
        list_config.addPlainTextColumn(
            'size', 'Size', lambda entity, *args: defaultfilters.
            filesizeformat(entity.content.size))
        list_config.setDefaultSort('name')

        list_config.setRowAction(lambda e, *args: links.LINKER.staticContent(
            e.parent(), e.content_id, url_names.GCI_CONTENT_DOWNLOAD))

        self._list_config = list_config
示例#21
0
    def __init__(self, data):
        self.data = data
        list_config = lists.ListConfiguration()

        list_config.addSimpleColumn('title', 'Title')
        #list_config.addPlainTextColumn(
        #    'task_type', 'Type',
        #    lambda entity, all_d, all_t, *args: entity.taskType(all_t))
        #list_config.addPlainTextColumn('arbit_tag', 'Tags', lambda entity,
        #                      *args: entity.taskArbitTag())
        list_config.addPlainTextColumn(
            'time_to_complete', 'Time to complete',
            lambda entity, *args: entity.taskTimeToComplete())
        list_config.addPlainTextColumn(
            'types', 'Type', lambda entity, *args: ", ".join(entity.types))

        list_config.setRowAction(lambda e, *args: data.redirect.id(e.key().id(
        )).urlOf(url_names.GCI_VIEW_TASK))

        self.list_config = list_config
示例#22
0
    def _getListConfig(self):
        """Returns ListConfiguration object for the list.
    """
        def proposedWinnersFunc(organization, *args):
            profiles = profile_model.GCIProfile.get(
                organization.proposed_winners)
            return ', '.join([p.public_name for p in profiles if p])

        list_config = lists.ListConfiguration()
        list_config.addPlainTextColumn('name', 'Name',
                                       lambda e, *args: e.name.strip())
        list_config.addPlainTextColumn('proposed_winners', 'Proposed Winners',
                                       proposedWinnersFunc)
        list_config.addPlainTextColumn(
            'backup_winner', 'Backup Winner',
            lambda e, *args: e.backup_winner.public_name
            if e.backup_winner else '')
        list_config.addSimpleColumn('profile_id', 'Username', hidden=True)
        list_config.setRowAction(self._getRedirect())

        return list_config
示例#23
0
    def __init__(self, data):
        self.data = data

        list_config = lists.ListConfiguration()

        list_config.addPlainTextColumn('name', 'Name',
                                       lambda e, *args: e.public_name.strip())
        list_config.addSimpleColumn('profile_id', 'Username')
        list_config.addPlainTextColumn('is_admin',
                                       'Is Admin',
                                       lambda e, *args: 'Yes'
                                       if e.is_admin else 'No',
                                       hidden=True)
        list_config.addPlainTextColumn(
            'email', 'Email', lambda entity, *args: entity.contact.email)

        def getMentorFor(entity, *args):
            """Helper function to get value of mentor_for column."""
            org_keys = [org_key.to_old_key() for org_key in entity.admin_for]
            return ', '.join(org.name
                             for org in org_model.GCIOrganization.get(org_keys)
                             if org)

        def getAdminFor(entity, *args):
            """Helper function to get value of admin_for column."""
            org_keys = [org_key.to_old_key() for org_key in entity.mentor_for]
            return ', '.join(org.name
                             for org in org_model.GCIOrganization.get(org_keys)
                             if org)

        list_config.addPlainTextColumn('admin_for', 'Admin For', getAdminFor)
        list_config.addPlainTextColumn('mentor_for', 'Mentor For',
                                       getMentorFor)

        addresses.addAddressColumns(list_config)

        list_config.setDefaultPagination(False)
        list_config.setDefaultSort('name')

        self._list_config = list_config
示例#24
0
    def __init__(self, data):
        self.data = data

        def getMentorFor(entity, *args):
            """Helper function to get value of mentor_for column."""
            return ', '.join(org.name
                             for org in ndb.get_multi(entity.mentor_for)
                             if org)

        def getAdminFor(entity, *args):
            """Helper function to get value of admin_for column."""
            return ', '.join(org.name
                             for org in ndb.get_multi(entity.admin_for) if org)

        list_config = lists.ListConfiguration()

        list_config.addPlainTextColumn(
            'name', 'Name', lambda entity, *args: entity.public_name.strip())
        list_config.addSimpleColumn('profile_id', 'Username')
        list_config.addPlainTextColumn('is_admin',
                                       'Is Admin',
                                       lambda entity, *args: 'Yes'
                                       if entity.is_admin else 'No',
                                       hidden=True)
        list_config.addPlainTextColumn(
            'email', 'Email', lambda entity, *args: entity.contact.email)
        list_config.addPlainTextColumn('admin_for', 'Admin For', getAdminFor)
        list_config.addPlainTextColumn('mentor_for', 'Mentor For',
                                       getMentorFor)

        addresses.addAddressColumns(list_config)
        list_config.addPlainTextColumn('tee_style', 'T-Shirt Style',
                                       lambda entity, *args: entity.tee_style)
        list_config.addPlainTextColumn('tee_size', 'T-Shirt Size',
                                       lambda entity, *args: entity.tee_size)

        list_config.setDefaultPagination(False)
        list_config.setDefaultSort('name')

        self._list_config = list_config
示例#25
0
    def _getListConfig(self):
        # TODO(nathaniel): squeeze this back into a lambda expression in
        # the call to setRowAction below.
        def RowAction(e, *args):
            # TODO(nathaniel): make this .organization call unnecessary.
            self.data.redirect.organization(organization=e)

            return self.data.redirect.urlOf(url_names.GCI_ORG_HOME)

        list_config = lists.ListConfiguration()
        list_config.addPlainTextColumn('name', 'Name',
                                       lambda e, *args: e.name.strip())
        list_config.addSimpleColumn('link_id', 'Organization ID', hidden=True)
        list_config.setRowAction(RowAction)
        list_config.addPlainTextColumn(
            'ideas',
            'Ideas',
            (lambda e, *args: url_helper.urlize(e.ideas, name="[ideas page]")),
            hidden=True)
        list_config.setDefaultPagination(False)
        list_config.setDefaultSort('name')
        return list_config
示例#26
0
    def __init__(self, request, data):
        self.request = request
        self.data = data

        list_config = lists.ListConfiguration()
        list_config.addSimpleColumn('name', 'Name')
        list_config.addSimpleColumn('status', 'Status')
        list_config.addPlainTextColumn(
            'last_sync_time', 'Last Sync Time',
            lambda ent, *args: format(
              ent.last_sync_time, lists.DATETIME_FORMAT) if \
              ent.last_sync_time else 'N/A')

        self._list_config = list_config

        def rowAction(entity, *args):
            entity_id = entity.key.id()

            return links.SOC_LINKER.shipmentInfo(
                data.program, entity_id, url_names.GSOC_EDIT_SHIPMENT_INFO)

        self._list_config.setRowAction(rowAction)
示例#27
0
    def _getListConfig(self):
        list_config = lists.ListConfiguration()

        def getMentors(entity, *args):
            """Helper function to get value for mentors column."""
            mentors = ndb.get_multi(
                map(ndb.Key.from_old_key,
                    GCITask.mentors.get_value_for_datastore(entity)))
            return ', '.join(mentor.public_name for mentor in mentors
                             if mentor)

        if 'title' in self._columns:
            list_config.addSimpleColumn('title', 'Title')

        if 'organization' in self._columns:
            list_config.addPlainTextColumn(
                'org', 'Organization', lambda entity, *args: entity.org.name)

        if 'mentors' in self._columns:
            list_config.addPlainTextColumn('mentors', 'Mentors', getMentors)

        if 'types' in self._columns:
            list_config.addPlainTextColumn(
                'types', 'Category',
                lambda entity, *args: ', '.join(entity.types))

        if 'tags' in self._columns:
            list_config.addPlainTextColumn(
                'tags', 'Tags', lambda entity, *args: ', '.join(entity.tags))

        if 'status' in self._columns:
            list_config.addSimpleColumn('status', 'Status')

        list_config.setRowAction(lambda e, *args: self.data.redirect.id(e.key(
        ).id()).urlOf('gci_view_task'))

        return list_config
示例#28
0
    def __init__(self, data, survey, record_model, idx=0, description=''):
        """Creates a new SurveyRecordList template.

    Args:
      data: The RequestData object to use.
      survey: The Survey to show the records for
      record_model: The Model class of the Record entities.
      idx: The index of the list to use.
      description: The (optional) description of the list.
    """
        super(SurveyRecordList, self).__init__(data)

        self.survey = survey
        self.record_model = record_model
        self.idx = idx
        self.description = description

        # Create the configuration based on the schema of the survey
        list_config = lists.ListConfiguration()
        schema = surveys.SurveySchema(survey)

        for field in schema:
            label = field.getLabel()
            field_id = field.getFieldName()
            list_config.addPlainTextColumn(field_id,
                                           label,
                                           field_or_empty(field_id),
                                           hidden=True)

        list_config.addSimpleColumn('created',
                                    'Created On',
                                    column_type=lists.DATE)
        list_config.addSimpleColumn('modified',
                                    'Last Modified On',
                                    column_type=lists.DATE)
        self.list_config = list_config
示例#29
0
    def _getListConfig(self):
        # TODO(nathaniel): squeeze this back into a lambda expression in the
        # call to setRowAction below.
        def RowAction(e, *args):
            # TODO(nathaniel): make this .organization call unnecessary.
            self.data.redirect.organization(organization=e)

            return self.data.redirect.urlOf(url_names.GCI_ORG_HOME)

        list_config = lists.ListConfiguration()
        list_config.addPlainTextColumn('name', 'Name',
                                       lambda e, *args: e.name.strip())
        list_config.addSimpleColumn('link_id', 'Organization ID', hidden=True)
        list_config.setRowAction(RowAction)
        list_config.setDefaultPagination(False)
        list_config.setDefaultSort('name')
        list_config.addPlainTextColumn(
            'org_admins',
            'Org Admins',
            lambda e, org_admins, *args: ", ".join(
                ["%s <%s>" % (o.name(), o.email)
                 for o in org_admins[e.key()]]),
            hidden=True)
        return list_config
示例#30
0
  def __init__(self, data):
    self.data = data
    self.idx = 1

    list_config = lists.ListConfiguration()

    list_config.setRowAction(
        lambda entity, *args: data.redirect.profile(
            entity.profile_id).urlOf(url_names.GCI_STUDENT_TASKS))

    list_config.addSimpleColumn('public_name', 'Public Name')

    list_config.addSimpleColumn('profile_id', 'Username')
    list_config.addPlainTextColumn(
        'email', 'Email', lambda entity, *args: entity.contact.email)
    list_config.addSimpleColumn('first_name', 'First Name', hidden=True)
    list_config.addSimpleColumn('last_name', 'Last Name')
    list_config.addBirthDateColumn(
        'birth_date', 'Birth date', lambda entity, *args: entity.birth_date,
        hidden=True)
    list_config.addSimpleColumn('gender', 'Gender')

    addresses.addAddressColumns(list_config)

    list_config.addPlainTextColumn(
        'school_id', 'School name',
        lambda entity, *args: entity.student_data.education.school_id,
        hidden=True)
    list_config.addPlainTextColumn(
        'school_country', 'School Country',
        lambda entity, *args: entity.student_data.education.school_country,
        hidden=True)
    list_config.addPlainTextColumn(
        'grade', 'Grade',
        lambda entity, *args: entity.student_data.education.grade, hidden=True)
    list_config.addPlainTextColumn(
        'expected_graduation', 'Expected Graduation',
        lambda entity, *args: entity.student_data.education.expected_graduation,
        hidden=True)
    list_config.addPlainTextColumn(
        'number_of_completed_tasks', 'Completed tasks',
        lambda entity, *args: entity.student_data.number_of_completed_tasks)

    def formsSubmitted(entity, form_type):
      """Returns "Yes" if form has been submitted otherwise "No".

      form takes either 'consent' or 'student_id' as values which stand
      for parental consent form and student id form respectively.
      """
      if form_type == 'consent':
        return 'Yes' if entity.student_data.consent_form else 'No'
      elif form_type == 'enrollment':
        return 'Yes' if entity.student_data.enrollment_form else 'No'
      else:
        raise ValueError('Unsupported form type: %s' % form_type)

    list_config.addPlainTextColumn(
        'consent_form', 'Consent Form Submitted',
        lambda entity, *args: formsSubmitted(entity, 'consent'))
    list_config.addPlainTextColumn(
        'enrollment_form', 'Student ID Form Submitted',
        lambda entity, *args: formsSubmitted(entity, 'enrollment'))

    list_config.addPlainTextColumn(
        'home_page', 'Home Page',
        lambda entity, *args: entity.contact.web_page, hidden=True)
    list_config.addPlainTextColumn(
        'blog', 'Blog',
        lambda entity, *args: entity.contact.blog, hidden=True)
    list_config.addSimpleColumn('tee_style', 'T-Shirt Style')
    list_config.addSimpleColumn('tee_size', 'T-Shirt Size')

    list_config.addHtmlColumn(
        'photo_url', 'Photo URL',
        (lambda entity, *args: urlize(entity.photo_url)), hidden=True)
    list_config.addSimpleColumn(
        'program_knowledge', 'Program Knowledge', hidden=True)

    self._list_config = list_config